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和其它代替方案的更多相关文章

  1. SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送

    代码全部复制,仅供自己学习用 1.环境搭建 因为在上一篇基于STOMP协议实现的WebSocket里已经有大概介绍过Web的基本情况了,所以在这篇就不多说了,我们直接进入正题吧,在SpringBoot ...

  2. springboot集成websocket的两种实现方式

    WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能 ...

  3. 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...

  4. 基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    https://www.cnblogs.com/wt645631686/p/7366924.html 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交 ...

  5. 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 ...

  6. Webapi实现websocket实时通讯

    应用场景:前端页面发起一个websocket请求与后端进行实时通讯.后端监听某端口获取数据,将监听到的数据加工处理,通过websocket发送到前端. 这里只提供后台的处理方案仅供参考. 1.后端监听 ...

  7. Java开发之使用websocket实现web客户端与服务器之间的实时通讯

    使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 <%@ page language="java" contentType=& ...

  8. PHP基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯

    前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...

  9. springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发

    工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...

  10. 微信小程序实时通讯(websocket)问题

    这几天值班忙的不要不要,人工智能这块看的都是零零散散,今天就来写写小程序的实时通讯吧.小程序端://这个是连接 lianjie:function(){ var socketOpen = false / ...

随机推荐

  1. linux文本三剑客之sed命令详解

    linux文本三剑客之sed命令详解 目录 linux文本三剑客之sed命令详解 1.sed命令详解 1.1 地址定界和编辑命令 1.2 搜索替换 1.3 sed高级用法 1.sed命令详解 sed称 ...

  2. 网络安全—IPSec安全策略

    文章目录 网络拓扑 添加策略 ESP 添加筛选器 添加筛选器的操作 另一台主机设置 AH 使用Windows Server 2003系统 网络拓扑 client1 IP = 192.168.17.10 ...

  3. mini-centos7 环境安装部署,各种踩坑。。。

    最小Linux系统,安装Java环境 想想就生气,去面试个运维,面试官让我上机装个centos7,还是个最小安装包连界面都没有,只有命令行模式,我都哭了,然后让把一些环境装一下,然后再部署个sprin ...

  4. 将外部jar打入本地maven仓库

    1.将jar包放入某不含中文的路径下 ,例如:E:\file\zip4j-1.3.2.jar 2.在命令行输入操作命令 mvn install:install-file -DgroupId=zip4j ...

  5. spring boot 在windows下的 批文件部署

    目录结构如下: install.bat @echo off SET JAVA_HOME="C:\Program Files\Java\jdk1.8.0_211\bin" copy ...

  6. Python OpenCV #1 - OpenCV介绍

    一.OpenCV介绍 1.1 OpenCV-Python教程简介 OpenCV由 Gary Bradsky 于1999年在英特尔创立,第一个版本于2000年发布. Vadim Pisarevsky 加 ...

  7. .NetCore 3.1 教程之 EFCore连接Mysql DBFirst模式 从数据库生成实体

    一:创建EF的类库,同时将此项目设置为启动项(为Scaffold-DbContext -tables指令使用),同时安装2个包   ①Microsoft.EntityFrameworkCore.Too ...

  8. GIT文件上传演示

    Be Written By Handat.憨大头 注:以下内容默认你已经做好了git工具的用户账户配置. (1)创建Gitee线上代码仓库,HTTPS协议地址就是仓库地址,如例https://gite ...

  9. node写接受

    选择数据库类型:mongodb 定义用户集合的字段(域): 用户名  密码  性别  爱好(多选)  简介 npm i -S express mongoose 在项目中连接mongodb服务 inde ...

  10. react做购物车的功能

    父组件 import React, { Component } from 'react' import Lists from '../components/Lists' export default ...