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=& ...
随机推荐
- 具体数学组合数习题选做(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)^ ...
- 具体数学第六章习题选做(genshining)
11.对于 \(n\ge 0\),求以下式子的封闭形式. \[\sum_k(-1)^k{n\brack k} \] 由于 \[\sum{n\brack k}x^k=x^{\overline n} \] ...
- Luogu P7077 CSP-S2020 函数调用 题解 [ 蓝 ] [ 拓扑排序 ] [ 动态规划 ] [ 数学 ]
函数调用:个人非常喜欢的一道拓扑题. 转化 这题一共有三种操作,不太好搞.而第一个函数看起来就比较可做,第三个函数显然就是让你拓扑转移,于是我们考虑第二个操作怎么处理. 当我们进行一个操作一后,假设当 ...
- donet 常用命令汇总......
dotnet new: 用于创建新的.NET项目. 示例:创建一个名为 "MyConsoleApp" 的控制台应用程序项目. dotnet new console -n MyCon ...
- 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
大家好,我是汤师爷! 最近,腾讯发布了一款ima产品,主打用AI来帮你搜索信息.管理知识库. 说实话,一开始用混元大模型,感觉不咋地,很鸡肋的. 不过最近腾讯把DeepSeek R1接进来了,一下子解 ...
- [WC2006] 水管局长 题解
最大值最小的路径肯定在最小生成树上,考虑用 \(LCT\) 维护最小生成树,只需要维护长度最长的边即可实现.由于 \(LCT\) 维护最小生成树不支持删边,所以采用倒序加边的方式处理. 时间复杂度 \ ...
- Arduino函数库和程序架构
Arduino程序的架构大体可分为3个部分. (1)声明变量及接口的名称. (2)setup().在Arduino程序运行时首先要调用setup()函数,用于初始化变量.设置针脚的输出/输入类型.配置 ...
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- Linux - 禁ping & 开放访问端口
适用于Linux操作系统 禁ping 1.编辑 /etc/sysctl.conf 文件,文件末尾增加如下内容后,保存退出. net.ipv4.icmp_echo_ignore_all = 1 2.在命 ...
- 记录-C#给图片增加文字
业务需要动态给图片增加文字(书本的封面图片),修改字体大小.字体.颜色.控制位置 测试代码: 1 string path = @"E:\cover.png"; 2 3 Bitmap ...