启动类增加注解并进行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连接的更多相关文章

  1. 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)

    工作时使用了Websocket技术,在使用的过程中发现,浏览器(Chrome)升级后可能会导致Websocket不可用,更换浏览器后可以正常使用. 近日偶尔一次在本地调试,发现使用相同版本的Chrom ...

  2. 7.1.1.关闭WebSocket连接

    7.1.定义 7.1.1.关闭WebSocket连接 为_关闭WebSocket连接_,端点需关闭底层TCP连接.端点应该使用一个方法完全地关闭TCP连接,以及TLS会话,如果合适,丢弃任何可能已经接 ...

  3. 学习html5的WebSocket连接

    1.什么是WebSocket WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSo ...

  4. WebSocket 连接关闭(代码:1006)

    前端WebSocket 连接关闭(代码:1006) function connect() { //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { w ...

  5. Chrome_查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. <!DOCTYPE html> <html lang=" ...

  6. websocket连接的后台反向代理问题

    今天要介绍的问题,是一个相对来说比较经典的问题,问题表面看不是很复杂的问题,但是反映出的背后通信逻辑,其实还是比较有意义的. websocket协议是当前绝大部分浏览器都支持的长连接协议,是HTTP协 ...

  7. 具备双向通行能力的架构对于移动APP属于刚性需求。 WebSocket连接 注册信令

    双向通信使用指南_用户指南(开放 API)_API 网关-阿里云 https://help.aliyun.com/document_detail/66031.html 流程描述 (1) 客户端在启动的 ...

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

  9. Chrome 浏览器中查看 webSocket 连接信息

      1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang ...

  10. 【web】Chrome 浏览器中查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang=& ...

随机推荐

  1. 具体数学组合数习题选做(Genshining)

    8.计算 \[\sum_k\binom{n}{k}(-1)^k(1-\frac{k}{n})^n \] 解: 考虑 \[\sum_{k=0}^n\binom{n}{k}(-1)^kf(k)=(-1)^ ...

  2. 具体数学第六章习题选做(genshining)

    11.对于 \(n\ge 0\),求以下式子的封闭形式. \[\sum_k(-1)^k{n\brack k} \] 由于 \[\sum{n\brack k}x^k=x^{\overline n} \] ...

  3. Luogu P7077 CSP-S2020 函数调用 题解 [ 蓝 ] [ 拓扑排序 ] [ 动态规划 ] [ 数学 ]

    函数调用:个人非常喜欢的一道拓扑题. 转化 这题一共有三种操作,不太好搞.而第一个函数看起来就比较可做,第三个函数显然就是让你拓扑转移,于是我们考虑第二个操作怎么处理. 当我们进行一个操作一后,假设当 ...

  4. donet 常用命令汇总......

    dotnet new: 用于创建新的.NET项目. 示例:创建一个名为 "MyConsoleApp" 的控制台应用程序项目. dotnet new console -n MyCon ...

  5. 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~

    大家好,我是汤师爷! 最近,腾讯发布了一款ima产品,主打用AI来帮你搜索信息.管理知识库. 说实话,一开始用混元大模型,感觉不咋地,很鸡肋的. 不过最近腾讯把DeepSeek R1接进来了,一下子解 ...

  6. [WC2006] 水管局长 题解

    最大值最小的路径肯定在最小生成树上,考虑用 \(LCT\) 维护最小生成树,只需要维护长度最长的边即可实现.由于 \(LCT\) 维护最小生成树不支持删边,所以采用倒序加边的方式处理. 时间复杂度 \ ...

  7. Arduino函数库和程序架构

    Arduino程序的架构大体可分为3个部分. (1)声明变量及接口的名称. (2)setup().在Arduino程序运行时首先要调用setup()函数,用于初始化变量.设置针脚的输出/输入类型.配置 ...

  8. QT5笔记:10. 容器类的迭代

    1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...

  9. Linux - 禁ping & 开放访问端口

    适用于Linux操作系统 禁ping 1.编辑 /etc/sysctl.conf 文件,文件末尾增加如下内容后,保存退出. net.ipv4.icmp_echo_ignore_all = 1 2.在命 ...

  10. 记录-C#给图片增加文字

    业务需要动态给图片增加文字(书本的封面图片),修改字体大小.字体.颜色.控制位置 测试代码: 1 string path = @"E:\cover.png"; 2 3 Bitmap ...