Eclipse 搭建一个简单的SpringBoot+WebSocket环境
WebSocket是一种在单个TCP连接上进行全双工通信的协议。
WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。
WebSocket API也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
使用SpringBoot+WebSocket搭建一个多人聊天系统
1、新建Spring Starter Project
2、添加对WebSocket的支持
注入ServerEndpointExporter,这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint。
1 package com.zzq.config;
2
3 import org.springframework.context.annotation.Bean;
4 import org.springframework.context.annotation.Configuration;
5 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
6
7 /**
8 *
9 * @author ZZQ-PC
10 *
11 */
12 @Configuration
13 public class AppConfiguration {
14
15 @Bean
16 public ServerEndpointExporter serverEndpointExporter(){
17 return new ServerEndpointExporter();
18 }
19
20 }
3、创建WebSocket的实现类
@ServerEndpoint("/webSocket/{page}")中的值就是需要访问的地址,和Controller中的@RequestMapping有点类似。然后实现@OnOpen(打开连接),@OnClose(关闭连接),@onMessage(收到消息),@Error(触发异常)。
1 package com.zzq.config;
2
3 import java.io.IOException;
4 import java.util.Map;
5 import java.util.Set;
6 import java.util.concurrent.ConcurrentHashMap;
7 import java.util.concurrent.CopyOnWriteArraySet;
8 import java.util.concurrent.atomic.AtomicInteger;
9
10 import javax.websocket.OnClose;
11 import javax.websocket.OnError;
12 import javax.websocket.OnMessage;
13 import javax.websocket.OnOpen;
14 import javax.websocket.Session;
15 import javax.websocket.server.PathParam;
16 import javax.websocket.server.ServerEndpoint;
17
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
20 import org.springframework.stereotype.Component;
21
22 /**
23 *
24 * @author ZZQ-PC
25 *
26 */
27 @Component
28 @ServerEndpoint("/webSocket/{page}")
29 public class WebSocket {
30 private Logger log = LoggerFactory.getLogger(this.getClass());
31
32 /**
33 * 用来记录房间的人数
34 */
35 private static AtomicInteger onlinePersons = new AtomicInteger(0);
36
37 /**
38 * 用来记录房间及人数
39 */
40 private static Map<String,Set> roomMap = new ConcurrentHashMap(8);
41
42 @OnOpen
43 public void open(@PathParam("page") String page, Session session) throws IOException {
44 Set set = roomMap.get(page);
45 // 如果是新的房间,则创建一个映射,如果房间已存在,则把用户放进去
46 if(set == null){
47 set = new CopyOnWriteArraySet();
48 set.add(session);
49 roomMap.put(page,set);
50 }else{
51 set.add(session);
52 }
53 // 房间人数+1
54 onlinePersons.incrementAndGet();
55 log.info("新用户{}进入聊天,房间人数:{}",session.getId(),onlinePersons);
56 }
57
58 @OnClose
59 public void close(@PathParam("page") String page, Session session){
60 // 如果某个用户离开了,就移除相应的信息
61 if(roomMap.containsKey(page)){
62 roomMap.get(page).remove(session);
63 }
64 // 房间人数-1
65 onlinePersons.decrementAndGet();
66 log.info("用户{}退出聊天,房间人数:{}",session.getId(),onlinePersons);
67 }
68
69 @OnMessage
70 public void reveiveMessage(@PathParam("page") String page, Session session,String message) throws IOException {
71 log.info("接受到用户{}的数据:{}",session.getId(),message);
72 // 拼接一下用户信息
73 String msg = session.getId()+" : "+ message;
74 Set<Session> sessions = roomMap.get(page);
75 // 给房间内所有用户推送信息
76 for(Session s : sessions){
77 s.getBasicRemote().sendText(msg);
78 }
79 }
80
81 @OnError
82 public void error(Throwable throwable){
83 try {
84 throw throwable;
85 } catch (Throwable e) {
86 log.error("未知错误");
87 }
88 }
89 }
4、在src/main/resources/static文件夹下新建index.html。
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8"></meta>
5 <title>springboot项目WebSocket测试demo</title>
6 </head>
7 <body>
8 <h3>springboot项目websocket测试demo</h3>
9 <h4>测试说明</h4>
10 <h5>文本框中数据数据,点击‘发送测试’,文本框中的数据会发送到后台websocket,后台接受到之后,会再推送数据到前端,展示在下方;点击关闭连接,可以关闭该websocket;可以跟踪代码,了解具体的流程;代码上有详细注解</h5>
11 <br />
12 <input id="text" type="text" />
13 <button onclick="send()">发送测试</button>
14 <hr />
15 <button onclick="clos()">关闭连接</button>
16 <hr />
17 <div id="message"></div>
18 <script>
19 var websocket = null;
20 if('WebSocket' in window){
21 websocket = new WebSocket("ws://127.0.0.1:8080/webSocket/1");
22 }else{
23 alert("您的浏览器不支持websocket");
24 }
25 websocket.onerror = function(){
26 setMessageInHtml("send error!");
27 }
28 websocket.onopen = function(){
29 setMessageInHtml("连接成功!")
30 setTimeout(function(){setMessageInHtml("欢迎来到这里!")
31 },2000)
32 }
33 websocket.onmessage = e => setMessageInHtml(e.data)
34 websocket.onclose = function(){
35 setMessageInHtml("连接断开!")
36 }
37 window.onbeforeunload = function(){
38 clos();
39 }
40 function setMessageInHtml(message){
41 document.getElementById('message').innerHTML += message+"</br>";
42 }
43 function clos(){
44 websocket.close(3000,"强制关闭");
45 }
46 function send(){
47 var msg = document.getElementById('text').value;
48 websocket.send(msg);
49 }
50 </script>
51 </body>
52 </html>
5、启动Spring boot工程
至此,一个简单的SpringBoot+WebSocket项目搭建完毕。
Eclipse 搭建一个简单的SpringBoot+WebSocket环境的更多相关文章
- 通过Jetty搭建一个简单的Servlet运行环境
最近在做一些简单的Servlet开发的时候,感觉每次调试的时候都要发布到tomcat上很麻烦,把程序共享给同事也很麻烦,需要帮他设置本地的tomcat环境. 在网上找了找其他的Servlet运行环境, ...
- 用 Eclipse 搭建一个简单的 Maven spring mybatis 项目(包含测试用例)
1: 先搭建一个Maven项目: 创建好后的目录: 2: 配置pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- iBatis第二章:搭建一个简单的iBatis开发环境
使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...
- IntelliJ IDEA搭建一个简单的springboot项目
一.IDEA 安装包 百度网盘链接:https://pan.baidu.com/s/1MYgZaBVWXgy64KxnoeJSyg 提取码:7dh2 IDEA注册码获取:http://idea.lan ...
- idea搭建一个简单的springboot项目
1.file->new->project 2.选中Spring Initializr 3.填写项目信息: 4.选中Web -> Spring Web
- 尝试自己搭一个简单的typescript运行环境
开发typescript项目有一些现成的脚手架,比如:typescript-library-starter,它的配置齐全,更适合用在实际项目开发上.其实在学习阶段可以自己搭建一个简单的typescri ...
- springboot搭建一个简单的websocket的实时推送应用
说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...
- 超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务
来自:JavaGuide Github 地址:https://github.com/Snailclimb/springboot-integration-examples 目录: 使用 SpringBo ...
- 使用 SpringBoot+Dubbo 搭建一个简单分布式服务
实战之前,先来看几个重要的概念 开始实战之前,我们先来简单的了解一下这样几个概念:Dubbo.RPC.分布式.由于本文的目的是带大家使用SpringBoot+Dubbo 搭建一个简单的分布式服务,所以 ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
随机推荐
- SCI、SSCI、EI、北大中文核心期刊、CSCD、CSSC、SCD、CSSCI 扩展版、计算机软件著作权
https://zhidao.baidu.com/question/308484724.html SCI(科学引文索引).EI(工程索引).ISTP(科技会议录索引)是世界著名的三大科技文献检索系统, ...
- git 命令 使用记录
这是ider 在pull 代码是报的异常大概意思是本机有未处理的合并可是点击view files都之前删除的一些文件 这种问题可以使用一下命令 git fetch --all && g ...
- inux配置PATH路径
查看PATH:echo $PATH以添加python3为列 修改方法一:export PATH=P A T H : PATH:PATH:HOME/bin:export PATH=P A T H : P ...
- Pyscript使用本地Pyodide配置方法
背景 Pyscript工程本身很小,KB级别,引用的Pyodide工程比较大,因为包含了各种类库的wasm文件,默认引用了cdn上的文件,cdn上的文件又在外网,访问会中断导致不可用,于是需要使用本地 ...
- twenty four
vue基础代码 <script src="vue路径"></script> <script> const vm = new Vue({ //el ...
- 【SHELL】记一个没啥用的脚本
因为最近Terraria更新了嘛,然后又想开服了,但是捏,我原来的UbuntuServer系统因为没有界面,而且我新购置了一台3D打印机,需要软件界面去操作,所以原先的系统就格了,重装win10,然后 ...
- -bash: nslookup: 未找到命令;centos7 安装nslookup
一.安装服务 [root@localhost ~]# yum -y install bind-utils 二.查看 [root@localhost ~]# nslookup
- chatGPT-meta抗衡版本
chatGPT-meta抗衡版本 链接:https://mp.weixin.qq.com/s/MbZTfVgxx221Eo9pl1h80w 内置 git代码 LLaMA 项目地址:https://gi ...
- Java期末课程设计--购物车的GUI(编辑中)
实现的功能 基本功能 使用admin登录 对商品表内的商品添加至购物车 结算价格 扩展功能 用户的登录注册(基于数据库) 钱包功能 结算前录入地址信息 丰富GUI(指插入图片) 管理员界面(对商品进行 ...
- CSS入门学习笔记
CSS入门学习笔记一.CSS简介1.什么是CSS?2.为什么使用CSS?3.CSS的作用二.CSS语法1.CSS基础语法2.CSS注释语法3.CSS应用方法三.CSS选择器1.元素选择器2.类选择器3 ...