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

在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而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包
        <!-- websocket模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
2.配置WebSocket
@Configuration
public class MyWebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
3.WebSocket连接,发送和接收信息
@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.mzph.cn/news/829715.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类神经网络3:DenseNet模型复现

目录 DenseNet网络架构 DenseNet部分实现代码 DenseNet网络架构 论文原址&#xff1a;https://arxiv.org/pdf/1608.06993.pdf 稠密连接神经网络&#xff08;DenseNet&#xff09;实质上是ResNet的进阶模型&#xff08;了解ResNet模型请点击&#xff09;&#xff0c;二者均是…

Java面试八股文-2024

面试指南 TMD&#xff0c;一个后端为什么要了解那么多的知识&#xff0c;真是服了。啥啥都得了解 MySQL MySQL索引可能在以下几种情况下失效&#xff1a; 不遵循最左匹配原则&#xff1a;在联合索引中&#xff0c;如果没有使用索引的最左前缀&#xff0c;即查询条件中没有包含…

linux demo

1.1&#xff09;if case test the results #!bin/bash read -p “请输入你的成绩&#xff1a;” num if [ $num -ge 0 ] && [ $num -le 100 ];then if [ $num -ge 80 ] && [ $num -le 100 ];then echo “成绩优秀” elif [ $num -ge 60 ] && [ $num …

Altera FPGA 配置flash读写

目录 一、读写控制器的配置 二、生成flash的配置文件 三、关于三种配置文件的大小 四、其他 一、读写控制器的配置 Altera ASMI Parallel&#xff08;下文简称ASMI)这个IP就仅仅是个Flash读写控制器&#xff0c;可以自由的设计数据来源。 关于这个IP的使用&#xff0c;可以…

【ARMv9 DSU-120 系列 2. -- DSU-120 Cluster 中组件详细介绍】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DynamIQ cluster componentsCoresComplexescluster shared logic主要特点小结Shared Logic ComponentsSnoop Control Unit缓存直接传输窥探过滤器自动大小调整Clock manag

MAC有没有免费NTFS tuxera激活码 tuxera破解 tuxera for mac2023序列号直装版 ntfs formac教程

Tuxera NTFS 2023破解版是一款非常好用的在线磁盘读写工具&#xff0c;该软件允许mac用户在Windows NTFS格式的硬盘上进行读写操作&#xff0c;Mac的文件系统是HFS&#xff0c;而Windows则使用NTFS格式&#xff0c;这导致在Mac系统上不能直接读写Windows格式的硬盘。然而&#…

【C++】指针与引用

文章目录 指针什么是指针?使用指针C++ 传递指针给函数C++ 从函数返回指针C++ Null 指针C++ 指针的算术运算指针递增与递减C++ 指针 vs 数组C++ 指向指针的指针(多级间接寻址)引用C++ 引用 vs 指针创建引用把引用作为参数把引用作为返回值参考链接指针 每一个变量都有一个内…

程序员:写好代码就行了,为什么要学写作

&#x1f341; 展望&#xff1a;关注我, AI 学习之旅上&#xff0c;我与您一同成长&#xff01; 一、引言 在当今这个信息爆炸的时代&#xff0c;程序员们往往沉浸在代码的世界里&#xff0c;用代码来解决问题。然而&#xff0c;你是否曾想过&#xff0c;除了代码&#xff0c;…

智慧校园-教务管理系统建设要素

自友科技教务管理系统是一种在现代化的教务管理理念和信息化管理技术之上的一种能够将学籍管理、教研备课、教学计划、教师工作、考务管理、试卷管理、成绩、选修课等紧密地联系起来&#xff0c;实现教务信息管理的一体化的系统&#xff0c;这样能够大大减少教务管理的人工操作…

windows ubuntu sed,awk,grep篇:2:sed 替换命令

目录 6.sed 替换命令语法 7.全局标志 g 8.数字标志(1,2,3 ….) 9.打印标志 p(print) 10.写标志 w 11.忽略大小写标志 i (ignore) 12.执行命令标志 e (excuate) 13.使用替换标志组合 14.sed 替换命令分界符 15.单行内容上执行多个命令 16.&的作用——获取匹配到的模式 17.分…

INSTEAD OF 触发器的创建

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 INSTEAD OF 触发器&#xff0c;也称替换触发器&#xff0c;是一种特殊的触发器&#xff0c;和其他建立在数据表上的触发器不同&#xff0c;INSTEAD OF 触发器建立在视图上。…

什么是vue,vue怎样使用?

Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0…

C++ 重载 [] 运算符

刚开始我是震惊的! 我从未想过[]下居然有逻辑! 从学步开始 曾因会使用a[0]访问数组元素而沾沾自喜 曾固步自封的认为[] ,理应是访问数组的一种方式 天真快乐的同时,认为[]只是一个无情的标识! 所以 当我们写下a[0]时,究竟是为了什么? 是为了找到a[0]对应的值 那么如何…

Podman入门全指南:安装、配置与运行容器

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Podman入门全指南&#xff1a;安装、配置与运行容器 前言Podman简介什么是 Podman&#xff1f;Podman 与 Docker 的主要区别 安装Podman支持的操作系统和环境安装步骤详解LinuxUbuntuCentOS/RHEL MacO…

双系统下删除ubuntu

絮絮叨叨 由于我在安装Ubuntu的时候没有自定义安装位置&#xff0c;而是使用与window共存的方式让Ubuntu自己选择安装位置&#xff0c;导致卸载时我不知道去格式化哪个分区&#xff0c;查阅多方资料后无果&#xff0c;后在大佬帮助下找到解决方案 解决步骤 1、 插上Ubuntu安…

Axure如何调起浏览器的打印功能

Axure如何调起浏览器的打印功能 答&#xff1a;javascript:window.print(); 不明白的继续往下看 应用场景&#xff1a; 原型设计中&#xff0c;页面上的打印按钮&#xff0c;需要模拟操作演示&#xff0c;需要点击指定的按钮时&#xff0c;唤起浏览器的打印功能&#xff08…

使用Pandas从Excel文件中提取满足条件的数据并生成新的文件

目录 一、引言 二、环境准备 三、读取Excel文件 四、数据筛选 五、保存为新的Excel文件 六、案例与代码总结 七、进阶用法与注意事项 八、结语 在数据处理的日常工作中&#xff0c;我们经常需要从大量数据中筛选出满足特定条件的数据集。Pandas是一个强大的Python数据分…

比 PSD.js 更强的下一代 PSD 解析器,支持 WebAssembly

比 PSD.js 更强的下一代 PSD 解析器&#xff0c;支持 WebAssembly 1.什么是 webtoon/ps webtoon/ps 是 Typescript 中轻量级 Adobe Photoshop .psd/.psb 文件解析器&#xff0c;对 Web 浏览器和 NodeJS 环境提供支持&#xff0c;且做到零依赖。 Fast zero-dependency PSD par…

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的&#xff0c;如果您不小心从系统中删除了文件或数据&am…

初识ChatGPT

初识ChatGPT AIGC这么火热&#xff0c;了解一下&#xff1f;本文主要通过ChatGPT整理了人工智能和GPT相关的很多概念&#xff0c;看完之后&#xff0c;应该能瞥见人工智能的冰山一角。 参考 GPT-4预示着前端开发的终结&#xff1f;你准备好面对无法预测的技术挑战了吗&#…