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=& ...
随机推荐
- 初识VPC网络的能力
本文分享自天翼云开发者社区<初识VPC网络的能力>,作者:布小匠 VPC网络的来源 在云计算早期是没有VPC的概念的,有的是虚拟网络和虚拟路由器的功能.虚拟网络的作用是为用户提供一个虚拟的 ...
- rbd常用的配置参数
本文分享自天翼云开发者社区<rbd常用的配置参数>,作者:l****n rbd的基本介绍 rbd的架构如下图所示: rbd采用CRUSH算法实现数据的随机分布.CRUSH算法,即Contr ...
- SQL注入之时间盲注
SQL注入之时间盲注 一.时间盲注原理 时间盲注技术的核心在于巧妙地运用数据库中的时间延迟函数(例如 MySQL 的 SLEEP() 函数或 PostgreSQL 的 PG_SLEEP() 函数)来验 ...
- WPF DataTemplate DataContext 绑定问题
当使用DataTemplate时,需要用数据绑定,设置数据绑定的方式可参考: https://supportcenter.devexpress.com/ticket/details/t736087/d ...
- Microsoft.Expression.Drawing文件安装
使用Blend的绘制功能,需要引用 Microsoft.Expression.Drawing 库文件, xmlns:ed="http://schemas.microsoft.com/expr ...
- Tensorflow 安装和测试(Anaconda4.7.10+windows10)
一. 软件下载 二. 配置相关 1. 修改 Jupyter notebook 默认工作路径 (1)打开 Anaconda Prompt ,输入 jupyter notebook --generate- ...
- 从android中删除短信
代码如下: getContentResolver().delete(Uri.parse("content://sms/#"),"address=?", new ...
- 解密ZAB协议:Zookeeper一致性的核心实现
一致性问题 设计一个分布式系统必定会遇到一个问题-- 因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consi ...
- MyBatisPlus - [07] Q&A
题记部分 001 || Public Key Retrieval is not allowed 通常出现在使用JDBC连接数据库时,特别时在尝试通过SSL/TLS加密连接到MySQL或MariaDB数 ...
- Kafka - server.properties参数详解
server.properties #broker的全局唯一编号,不能重复 broker.id=0 #用来监听链接的端口(kafka端口号),producer或consumer将在此端口建立连接 po ...