SpringBoot集成实时通讯WebSocket和其它代替方案
WebSocket 双向实时通讯
一、添加WebSocketConfig配置类
/**
* 开启WebSocketConfig
*/
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter(){
return new ServerEndpointExporter();
}
}
二、创建WebSocket服务处理类
/**
* 服务处理类
*/
@ServerEndpoint("/websocket/{sid}/{name}")
@Component
public class WebSocketServer {
static Log log = LogFactory.get(WebSocketServer.class);
//静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static AtomicInteger onlineCount = new AtomicInteger(0);
//concurrent包的线程安全Set,用来存放每个客户端对应的会话
private static CopyOnWriteArraySet<Session> sessions = new CopyOnWriteArraySet<>();
// 注入bean
private static RedisCache redisCache;
@Authowired
public void setRedisCache(RedisCache redisCache){
this.redisCache = redisCache;
}
/**
* 连接建立成功调用的方法*/
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid, @PathParam("name") String name) {
sessions.add(session);
addOnlineCount(); //在线数加1
log.info("有新窗口开始监听:" + sid + "|" + name + ",当前在线人数为" + getOnlineCount());
try {
session.getBasicRemote().sendText("连接成功");
} catch (IOException e) {
log.error("websocket IO异常");
e.printStackTrace();
}
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
sessions.remove(session);
subOnlineCount(); //在线数减1
log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) {
String name = session.getPathParameters().get("name");
log.info("收到来自窗口[" + session.getId() + "|" + name + "]的信息:" + message);
// 可以收到客户端消息,可以根据消息指令处理一些业务(推送消息给前端/关闭推送/其它业务处理)
}
/**
* 实现服务器主动推送
*/
public synchronized void sendMessage(String message, String sessionId, String name) {
log.info("推送消息到任务窗口[" + sessionId + "|" + name + "],推送内容:" + message);
for (Session session : sessions) {
try {
if(session.getId().equals(sessionId)){
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
continue;
}
}
}
/**
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误");
error.printStackTrace();
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
三、vue前端
在data中创建websock对象
/**
* 创建websocket
*/
initWebSocket(){
console.log("创建WebSocket")
this.websock = new WebSocket("ws://127.0.0.1:9998/websocket/ydsj")
this.websock.onmessage = this.websocketonmessage
this.websock.onerror = this.websocketonerror
this.websock.onopen = this.websocketonopen
this.websock.onclose = this.websocketclose
},
// 连接建立之后执行send方法发送数据
websocketonopen () {
let data = {
code: 0,
msg: '这是client:初次连接'
}
this.websocketsend(data)
},
websocketonerror () {
console.log( 'WebSocket连接失败')
},
// 数据接收
websocketonmessage (e) {
console.log('数据接收' + e.data)
},
// 数据发送
websocketsend (Data) {
this.websock.send(Data)
},
// 关闭
websocketclose (e) {
console.log('已关闭连接', e)
}
WebSocket 其它替代方案
SSE 服务器发送事件
服务器发送事件Server-Sent-Events(SSE)是一种服务器推送技术,允许服务器通过单个 HTTP 连接向客户端推送数据。
SSE 与 WebSocket 作用相似,都是建立浏览器与服务器之间的通信渠道,然后服务器向浏览器推送信息。
总体来说,WebSocket 更强大和灵活。因为它是全双工通道,可以双向通信;SSE 是单向通道,只能服务器向浏览器发送,因为流信息本质上就是下载。如果浏览器向服务器发送信息,就变成了另一次 HTTP 请求。
Server-Sent-Events(SSE)是一种HTML5 API,用于在服务器和客户端之间实时推送数据流。 SSE可以用于实现实时通知、实时聊天、实时数据更新和实时监控等功能。
- SSE 默认支持断线重连,WebSocket 需要自己实现。
- SSE 一般只用来传送文本,二进制数据需要编码后传送,WebSocket 默认支持传送二进制数据。
- SSE 支持自定义发送的消息类型。
- SSE 基于 HTTP 协议,目前除了 IE/Edge,其他浏览器都支持。
长轮询
长轮询是一种客户端向服务器发送 HTTP/HTTPS 请求的方法,但客户端不会立即收到服务器的响应,而是需要保持 HTTP 连接。保持 HTTP 连接可使服务器在数据可用或达到超时阈值时稍后回复。收到响应后,客户端将立即发送后续请求。
长轮询无需 WebSockets 提供的双向通信通道就能实现实时通信。其核心区别在于,客户端将发送多个请求来重新建立与服务器的连接,而不是像 WebSockets 那样维护一个持久连接。
MQTT
MQTT 是一种轻量级的发布-订阅式机器对机器网络协议,专为网络带宽有限的远程设备而设计。由于资源限制,智能传感器、可穿戴设备和其他物联网设备通常需要使用这种协议。虽然 WebSockets 可用于各种应用,但 MQTT 是明确为机器对机器通信而设计的,因此在这些使用案例中被视为一种替代方案。MQTT 具有开销低、消息传递效率高和支持离线操作等特点。
WebRTC
WebRTC 是一个免费的开源项目,可为 Web 浏览器和移动设备提供实时通信。它由 C++ 和 JavaScript 编写,可为网络浏览器和移动设备提供实时通信。WebRTC 可直接从点对点流式传输音频和视频,无需服务器端连接或额外插件。对于实时流媒体、视频会议或群组通话等用例,这些功能可通过 HTML5 和 JavaScript 使用 WebRTC API 快速实现。总之,在这些使用案例中,WebRTC 的点对点特性有助于减少服务器负载,并提供比 WebSockets 更高效、更高质量的通信体验。
WebTransport
WebTransport 是一种新的 Web 通信协议,可在客户端和服务器之间提供低延迟、高吞吐量的连接。它的创建是为了解决传统协议(如 WebSockets)的一些局限性,并提供一种能更好地满足当今网络应用需求的现代替代方案。
WebTransport 是一个协议框架,该协议使客户端与远程服务器在安全模型下通信,并且采用安全多路复用传输技术。最新版的WebTransport草案中,该协议是基于HTTP3的,即WebTransport可天然复用QUIC和HTTP3的特性。
SpringBoot集成实时通讯WebSocket和其它代替方案的更多相关文章
- SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送
代码全部复制,仅供自己学习用 1.环境搭建 因为在上一篇基于STOMP协议实现的WebSocket里已经有大概介绍过Web的基本情况了,所以在这篇就不多说了,我们直接进入正题吧,在SpringBoot ...
- springboot集成websocket的两种实现方式
WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能 ...
- 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- 基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
https://www.cnblogs.com/wt645631686/p/7366924.html 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交 ...
- Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
https://blog.csdn.net/a123demi/article/details/78234023 : Springboot集成mybatis(mysql),mail,mongodb,c ...
- Webapi实现websocket实时通讯
应用场景:前端页面发起一个websocket请求与后端进行实时通讯.后端监听某端口获取数据,将监听到的数据加工处理,通过websocket发送到前端. 这里只提供后台的处理方案仅供参考. 1.后端监听 ...
- Java开发之使用websocket实现web客户端与服务器之间的实时通讯
使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...
- PHP基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发
工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...
- 微信小程序实时通讯(websocket)问题
这几天值班忙的不要不要,人工智能这块看的都是零零散散,今天就来写写小程序的实时通讯吧.小程序端://这个是连接 lianjie:function(){ var socketOpen = false / ...
随机推荐
- 记录——Qt Qcreator 顶部菜单栏的隐藏与恢复
问题 我有一个朋友(嗯~无中生友),手残点击了 QCreator 中视图下的这个玩意儿: 当人的眼神不好时,可能不会看到这些快捷键以及无视这些弹窗. 解决方案 快捷键 ctrl + alt + M 可 ...
- IDS4 傻瓜式实践指南
前言: 这是一篇实践指南,不会过多的解释原理(因为我也说不清楚,想了解的同学请移步老张的博客,里面有非常详细的介绍),本篇文章讲解如何简单的使用IDS4来实现单点登录,以及遇到的一些坑实现功能: 1. ...
- 史上最全shell脚本编程语法上册
1. shell 脚本语言的基本用法 1.1 shell 脚本的用途 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率: 减少手工命令的输入,一定程度上避免人为错误: 将软件或应用的安装及 ...
- Anagrams(字谜)
描述 Most crossword puzzle(猜字谜) fans are used to anagrams(字谜)--groups of words with the same letters i ...
- .NET桌面程序混合开发之一:Winform+H5,WebView2概览
1. 基于Microsoft Edge的WebView2介绍 Microsoft Edge WebView2控件可以将web技术(HTML,css,javascript)应用于原生程序中.WebVie ...
- 🔥 FolkMQ v1.5.1 发布(“新式” 国产消息中间件)
FolkMQ 是个"新式"的消息中间件.强调:"小而巧"."简而强". 功能简表 角色 功能 生产者(客户端) 发布普通消息.Qos0消息. ...
- Mp4V2与ffmpeg静态库符号冲突问题解决
一.为什么静态符号会冲突 无论macho二进制类型,还是Windows上的PE格式,还是Linux上的ELF格式,里面都是按照特定格式存放的一个程序的代码和数据 比如Linux下的可执行文件格式,大致 ...
- 从零开始写 Docker(十七)---容器网络实现(中):为容器插上”网线“
本文为从零开始写 Docker 系列第十七篇,利用 linux 下的 Veth.Bridge.iptables 等等相关技术,构建容器网络模型,为容器插上"网线". 完整代码见:h ...
- go 1.6 废弃 io/ioutil 包后的替换函数
go 1.6 废弃 io/ioutil 包后的替换函数 io/ioutil 替代 ioutil.ReadAll -> io.ReadAll ioutil.ReadFile -> os.R ...
- 前台往后台传id
js页面var stuid;$(function () { var request = { QueryString : function(val) { var uri = window.locatio ...