WebSocket连接
启动类增加注解并进行Bean注入
@EnableWebSocket
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
pom文件引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
package com.hwd.campus.security.biz.websocket;
import com.hwd.campus.security.biz.utils.WebsocketUtil;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
@Slf4j
@Getter
@ServerEndpoint("/ws/notify/{requireId}/{token}")
@Component
@EqualsAndHashCode
public class NotifyWebsocket {
private Session session;
private String token;
private String requireId;
private long timeStamp;
@OnOpen
public void onOpen(Session session, @PathParam("requireId") String requireId, @PathParam("token") String token) {
this.session = session;
this.token = token;
this.requireId = requireId;
WebsocketUtil.addNotify(this);
}
@OnClose
public void onClose() {
WebsocketUtil.delNotify(this);
}
@OnMessage
public void onMessage(String message, @PathParam("requireId") String requireId, @PathParam("token") String token) {
//处理中心
log.info("来自客户端" + requireId + "的消息:" + message);
sendMessage("收到来自客户端" + requireId + "的消息:" + message);
}
@OnError
public void onError(Throwable error) {
log.error("websocket发生错误" + error);
}
/**
* 发送消息
*
* @param message 消息
*/
public void sendMessage(String message) {
try {
this.timeStamp = System.currentTimeMillis();
log.info("发送消息给客户端:" + message);
this.session.getAsyncRemote().sendText(message);
} catch (Exception e) {
log.error("发送消息失败" + e);
//WebsocketUtil.delNotify(this);
}
}
}
工具类
package com.hwd.campus.security.biz.utils;
import cn.hutool.core.date.DatePattern;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.hwd.campus.security.biz.websocket.NotifyWebsocket;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.CopyOnWriteArraySet;
@Slf4j
public class WebsocketUtil {
private static final CopyOnWriteArraySet<NotifyWebsocket> NOTIFY_WEBSOCKET_LIST = new CopyOnWriteArraySet<>();
public static void addNotify(NotifyWebsocket notifyWebsocket) {
NOTIFY_WEBSOCKET_LIST.add(notifyWebsocket);
log.info("有新连接加入数据通知服务,服务端当前在线人数为" + NOTIFY_WEBSOCKET_LIST.size());
}
public static void delNotify(NotifyWebsocket notifyWebsocket) {
NOTIFY_WEBSOCKET_LIST.remove(notifyWebsocket);
log.info("有新连接离开数据通知服务,服务端当前在线人数为" + NOTIFY_WEBSOCKET_LIST.size());
}
public static void sendNotifyMsg(String requireId, Object vo) {
//根据requireId,相同的才发送信息
if (NOTIFY_WEBSOCKET_LIST.size() == 0) {
return;
}
//发送消息
for (NotifyWebsocket notify : NOTIFY_WEBSOCKET_LIST) {
long timeStamp = notify.getTimeStamp();
long timeMillis = System.currentTimeMillis();
if (timeStamp > timeMillis) {
continue;
}
if (notify.getRequireId().equals(requireId)) {
//发送信息
log.info("已发送数据给" + notify.getRequireId());
JSONConfig config = new JSONConfig();
config.setDateFormat(DatePattern.NORM_DATETIME_PATTERN);
notify.sendMessage(JSONUtil.toJsonStr(vo, config));
}
}
}
}
线上环境可以在nginx配置文件增加如下配置
location /securityWs/ {
proxy_pass http://192.168.3.152:8400/;
proxy_redirect off;
proxy_read_timeout 3600s;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
WebSocket连接的更多相关文章
- 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)
工作时使用了Websocket技术,在使用的过程中发现,浏览器(Chrome)升级后可能会导致Websocket不可用,更换浏览器后可以正常使用. 近日偶尔一次在本地调试,发现使用相同版本的Chrom ...
- 7.1.1.关闭WebSocket连接
7.1.定义 7.1.1.关闭WebSocket连接 为_关闭WebSocket连接_,端点需关闭底层TCP连接.端点应该使用一个方法完全地关闭TCP连接,以及TLS会话,如果合适,丢弃任何可能已经接 ...
- 学习html5的WebSocket连接
1.什么是WebSocket WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSo ...
- WebSocket 连接关闭(代码:1006)
前端WebSocket 连接关闭(代码:1006) function connect() { //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { w ...
- Chrome_查看 webSocket 连接信息
1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. <!DOCTYPE html> <html lang=" ...
- websocket连接的后台反向代理问题
今天要介绍的问题,是一个相对来说比较经典的问题,问题表面看不是很复杂的问题,但是反映出的背后通信逻辑,其实还是比较有意义的. websocket协议是当前绝大部分浏览器都支持的长连接协议,是HTTP协 ...
- 具备双向通行能力的架构对于移动APP属于刚性需求。 WebSocket连接 注册信令
双向通信使用指南_用户指南(开放 API)_API 网关-阿里云 https://help.aliyun.com/document_detail/66031.html 流程描述 (1) 客户端在启动的 ...
- .net , java webSocket 连接 Socket.io (1.4.4版本) 问题
.net版Socketio4net类库和java版socket.io-java-client类库 连接socket.io 1.4版本都不行,网上大多是socket.io 0.9版本的,socket.i ...
- Chrome 浏览器中查看 webSocket 连接信息
1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang ...
- 【web】Chrome 浏览器中查看 webSocket 连接信息
1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang=& ...
随机推荐
- 认识soui4js(第5篇):使用扩展控件
无论内置控件多么丰富,也不可能满足用户所有需求.总有时候用户需要自己扩展控件. soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用. 扩展控件通常涉及到图形上下文的频繁交互 ...
- Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践
title: Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践 date: 2025/2/5 updated: 2025/2/5 author: cmdragon exce ...
- 天翼云VPC支持专线健康检查介绍
本文分享自天翼云开发者社区<天翼云VPC支持专线健康检查介绍>,作者:汪****波 天翼云支持本地数据中心IDC(Internet Data Center)通过冗余专线连接到天翼云云上专有 ...
- 玩转云端 | 拥有HBlock这项“存储盘活绝技”,数据中心也能“热辣瘦身”!
夏天马上就要到了,"瘦身"不光是特定人群的需求,也是数据中心的需求.构建轻量化.低碳化.高性价比的新型数据中心,更有效地支撑经济社会数字化转型,已成为业界主流趋势. 如何让数据中心 ...
- 在IDEA如何使用JProfiler性能分析
一.下载地址 https://www.ej-technologies.com/download/jprofiler/files 版本:11 激活码:L-J11-Everyone#speedzodiac ...
- C# Windows Service 安装与卸载
安装与卸载的使用工具 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe (一般安装了.NetFramework 后就会有该 ...
- 探秘Transformer系列之(4)--- 编码器 & 解码器
探秘Transformer系列之(4)--- 编码器 & 解码器 0x00 摘要 对于机器翻译,Transformer完整的前向计算过程如下图所示(与总体架构那章的流程图相比较,此处重点突出了 ...
- 深入理解 Docker 容器技术
一.引言 在当今的云计算和软件开发领域,Docker 容器技术已经成为了一项不可或缺的工具.它极大地改变了应用程序的部署和运行方式,为开发者和运维人员带来了诸多便利. 二.Docker 容器是什么? ...
- .NET10 - 预览版1新功能体验(一)
.NET 10 首个预览版已经在前两天发布,该版本在 .NET Runtime.SDK.libraries.C#.ASP.NET Core.Blazor 和 .NET MAUI 等多个方面都有重大改进 ...
- QSound、QSoundEffect播放WAV音频
QSound.QSoundEffect播放WAV音频 本文旨在介绍QSound.QSoundEffect的简单播放音频的方法以及对这两个类的一些基本介绍 文章目录 QSound.QSoundEffec ...