消息服务应用1——java项目使用websocket

ops/2024/9/24 5:21:51/

在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而WebSocket由于其自身的可靠性强,实时性好,带宽占用更小的优势,在实时通讯应用场景中独占鳌头,加上HTML5标准的普及流行,在前端和后端开发中应用异常广泛。

一.关于WebSocket

1.WebSocket是什么?

WebSocket是基于TCP的一种新的网络协议>网络协议。它实现了浏览器与服务器全双通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。简单来说,它就是html5中的一种新的协议,其实质就是对html的长连接的一种升级。

2.与HTTP比较
  • HTTP是短连接,WebSocket是长连接;
  • HTTP通信是单向的,基于请求响应模式,WebSocket支持双向通信;
  • HTTP和WebSocket底层都是TCP连接。
3.WebSocket优点
  • websocket连接只需要建立一次,在第一次连接的时候,客户端和服务器会交换必要的信息。
  • websocket是双向通信的,对比ajax请求还是长轮询,他们都是通过客户端发送请求,服务器响应的形式完成信息的交换,这种模式下服务器处于一种被动的角色。而websocket不存在这个问题,websocket的链接一旦建立,服务器和客户端都可以互推信息。

二. WebSocket使用

文案基于jdk1.8+maven3.8.1+springboot2.7.13而编写

1.引入websocket.jar包
java">        <!-- websocket模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
2.配置WebSocket
java">@Configuration
public class MyWebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
3.WebSocket连接,发送和接收信息
java">@ServerEndpoint("/websocket/test")
@Component
public class TestWebSocketInfo {/*** 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/private static int ONLINE_COUNT = 0;/*** concurrent包的线程安全Set,用来存放每个客户端对应的BigScreenWebSocket对象。*/private static CopyOnWriteArraySet<TestWebSocketInfo> WEB_SOCKET_SET = new CopyOnWriteArraySet<>();/*** 存储新链接标识。*/public static Map<String, Object> USER_SESSIONS = new HashMap<>(0);/*** 与某个客户端的连接会话,需要通过它来给客户端发送数据。*/private Session session;/*** 连接建立成功调用的方法*/@OnOpenpublic void onOpen(Session session) throws Exception {this.session = session;// 生成唯一IDString uuid = String.valueOf(UUID.randomUUID());// 把唯一标识跟客户端绑定USER_SESSIONS.put(uuid, this.session);// 加入set中WEB_SOCKET_SET.add(this);synchronized (this) {// 使用加锁的方式保证请求串行计数TestWebSocketInfo.ONLINE_COUNT++;}//需要发送到业务数据onMessage(JSONObject.toJSONString("Hello,Websocket"));System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {// 从set中删除WEB_SOCKET_SET.remove(this);boolean removeFlag = WEB_SOCKET_SET.remove(this);// 使用加锁的方式保证请求串行计数if (removeFlag && BigScreenWebSocketInfo.ONLINE_COUNT > 0) {TestWebSocketInfo.ONLINE_COUNT--;}System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message) {sendMessage(message);}/*** 发生错误时调用** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {// 从set中删除USER_SESSIONS.remove(session);// 从set中删除boolean removeFlag = WEB_SOCKET_SET.remove(this);USER_SESSIONS.remove(session);// 使用加锁的方式保证请求串行计数if (removeFlag && BigScreenWebSocketInfo.ONLINE_COUNT > 0) {TestWebSocketInfo.ONLINE_COUNT--;}System.out.println("发生错误");error.printStackTrace();}public void sendMessage(String message) {try {for (TestWebSocketInfo item : WEB_SOCKET_SET) {// 判断链接是否关闭if (item.session.isOpen()) {synchronized (item.session) {item.session.getBasicRemote().sendText(message);}}}} catch (Exception e) {e.printStackTrace();}}public static synchronized int getOnlineCount() {return ONLINE_COUNT;}
}
4.功能测试

当服务端开发完成之后,可以使用https://wstool.js.org/该网址自主连接测试


http://www.ppmy.cn/ops/13293.html

相关文章

docker容器

一、docker容器操作 1.1 容器创建 将镜像加载到容器的过程。新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 格式&#xff1a;docker create [选项] 镜像 常用选项&#xff1a; -i容器开启标准输入-t让docker分配一个…

学习STM32第十八天

RTC外设详解 一、RTC实时时钟实验 RTC配置流程如下 解锁备份域写保护 RTC核心寄存器在备份域内&#xff0c;备份域归属PWR&#xff0c;因此需要开启PWR时钟再使能备份与中寄存器的写访问。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //电源控制寄存器在APB1…

二次封装el-carousel

我们创建了一个名为MyCarousel的组件&#xff0c;它接受el-carousel的一些常用属性作为props&#xff0c;并默认提供了一些值。我们还通过setup函数返回了所有props&#xff0c;以便它们可以在模板中被使用。 1.MyCarousel.vue组件 <!-- 轮播图片 --> <template>…

【配电网故障定位】基于二进制混合灰狼粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#79】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制混合灰狼粒子群算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络…

Music Tag Editor Pro for Mac:音乐标签编辑软件

Music Tag Editor Pro for Mac是一款功能强大的音乐标签编辑软件&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户轻松管理音乐库中的标签信息。 Music Tag Editor Pro for Mac v8.0.0中文激活版下载 该软件支持多种音频格式&#xff0c;包括MP3、M4A、FLAC、APE等&#x…

测试开发面经记录

目录 字节测试&#xff08;1h&#xff09; 米哈游业务测试&#xff08;40min&#xff09; 美团测开&#xff08;50min&#xff09; 美图测试&#xff08;1h30min&#xff09; 腾讯云智测试&#xff08;24min&#xff09; 腾讯测试一面&#xff08;35min&#xff0c;凉&am…

MySQL数据库基础

目录 1. 数据库的操作 1.1 显示当前的数据库 1.2 创建数据库 1.3 使用/选中 数据库 1.4 删除数据库 2. 常用数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 3. 表的操作 ​编辑 3.1 查看所有表 3.2 创建表 3.3 查看表结构 3.4 删除表 练习: 1. 数据库的操作 1.1 …

unity学习(87)——断线的原因--客户端堆栈溢出1

无论unity还是exe问题都是一样的&#xff0c;都是客户端一直在发123&#xff0c;但收不到124&#xff0c;退出时服务器能发126&#xff0c;但是客户端压根接受不到126。一下确实解决不了问题&#xff0c;但其实已经十分接近了&#xff01; 客户端断线后就再也收不到任何包了&a…