引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocketConfig(配置)

/*** 开启webSocket*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}

WebSocketServer(服务)

@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class WebSocketServer {/**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。*/private static int onlineCount = 0;/**concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。*/private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap<>();/**与某个客户端的连接会话,需要通过它来给客户端发送数据*/private Session session;/**接收userId*/private String userId="";/*** 连接建立成功调用的方法* */@OnOpenpublic void onOpen(Session session,@PathParam("userId") String userId) {this.session = session;this.userId=userId;if(webSocketMap.containsKey(userId)){webSocketMap.remove(userId);//加入set中}else{webSocketMap.put(userId,this);//加入set中addOnlineCount();//在线数加1}log.info("用户连接:"+userId+",当前在线人数为:" + getOnlineCount());try {sendMessage("连接成功");} catch (IOException e) {log.error("用户:"+userId+",网络异常!!!!!!");}}/*** 连接关闭调用的方法*/@OnClosepublic void onClose() {if(webSocketMap.containsKey(userId)){webSocketMap.remove(userId);//从set中删除subOnlineCount();}log.info("用户退出:"+userId+",当前在线人数为:" + getOnlineCount());}/*** 收到客户端消息后调用的方法** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session) {log.info("用户消息:"+userId+",报文:"+message);//可以群发消息//消息保存到数据库、redisif(StringUtils.isNotBlank(message)){try {//解析发送的报文JSONObject jsonObject = JSONObject.parseObject(message);//追加发送人(防止串改)jsonObject.put("fromUserId",this.userId);String fromUserId=jsonObject.getString("fromUserId");//传送给对应toUserId用户的websocketif(StringUtils.isNotBlank(fromUserId) && webSocketMap.containsKey(fromUserId)){//                    webSocketMap.get(fromUserId).sendMessage(jsonObject.toJSONString());//自定义-业务处理DeviceLocalThread.paramData.put(jsonObject.getString("group"),jsonObject.toJSONString());}else{log.error("请求的userId:"+fromUserId+"不在该服务器上");//否则不在这个服务器上,发送到mysql或者redis}}catch (Exception e){e.printStackTrace();}}}/***  发生错误时候* @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("用户错误:"+this.userId+",原因:"+error.getMessage());error.printStackTrace();}/*** 实现服务器主动推送*/public void sendMessage(String message) throws IOException {//加入线程锁synchronized (session){try {//同步发送信息this.session.getBasicRemote().sendText(message);} catch (IOException e) {log.error("服务器推送失败:"+e.getMessage());}}}/*** 发送自定义消息* *//*** 发送自定义消息* @param message 发送的信息* @param toUserId  如果为null默认发送所有* @throws IOException*/public static void sendInfo(String message,String toUserId) throws IOException {//如果userId为空,向所有群体发送
//        if(StringUtils.isEmpty(toUserId)) {//向所有用户发送信息Iterator<String> itera = webSocketMap.keySet().iterator();while (itera.hasNext()) {String keys = itera.next();WebSocketServer item = webSocketMap.get(keys);item.sendMessage(message);}
//        }
//        //如果不为空,则发送指定用户信息
//        if(webSocketMap.containsKey(toUserId)){//            WebSocketServer item = webSocketMap.get(toUserId);
//            item.sendMessage(message);
//        }else{//            log.error("请求的userId:"+toUserId+"不在该服务器上");
//        }}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocketServer.onlineCount++;}public static synchronized void subOnlineCount() {WebSocketServer.onlineCount--;}public static synchronized ConcurrentHashMap<String,WebSocketServer> getWebSocketMap(){return WebSocketServer.webSocketMap;}
}

SpringBoot配置websocket相关推荐

  1. 实现微信支付(Native支付),使用WebSocket进行推送 ——4.配置SpringBoot支持WebSocket,推送结果

    实现微信支付(Native支付),使用WebSocket进行推送 --4.配置SpringBoot支持WebSocket,推送结果 依赖 <dependency><groupId&g ...

  2. SpringBoot 集成 WebSocket,实现后台向前端推送信息

    作者 | 大树先生 来源 | https://blog.csdn.net/MacWx/article/details/111319558 前言 在一次项目开发中,使用到了Netty网络应用框架,以及M ...

  3. SpringBoot集成WebSocket,实现后台向前端推送信息

    作者 | 大树先生 来源 | https://blog.csdn.net/MacWx/article/details/111319558 前言 在一次项目开发中,使用到了Netty网络应用框架,以及M ...

  4. springboot整合websocket实现一对一消息推送和广播消息推送

    springboot基础环境,请参考springboot文档 maven依赖 <dependency><groupId>org.springframework.boot< ...

  5. SpringBoot 集成WebSocket

    什么是WebSocket WebSocket 是一种网络通信协议,很多高级功能都需要它. 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信 ...

  6. Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)

    Springboot整合Websocket遇到的坑 一.使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean @Confi ...

  7. SpringBoot使用Websocket

    webSocket是HTML5的一种新协议,它实现了服务端与客户端的全双工通信,建立在传输层,tcp协议之上,即浏览器与服务端需要先建立tcp协议,再发送webSocket连接建立请求.webSock ...

  8. springboot整合websocket进行消息推送

    什么是websocket? WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据. ...

  9. springboot中websocket服务怎么调用其他类的方法

    前言: 之前有写过一个springboot整合websocket的博客(SpringBoot 集成websocket_清泉影月的博客-CSDN博客),最开始的使用场景就是用websocket发消息给其 ...

最新文章

  1. go和java线程,Go的多线程和pthread或Java线程有什么区别?
  2. 这6个高效的Java库,你知道吗?
  3. php 去掉数组中的空值_PHP删除数组中空值的方法介绍
  4. Android开发之解决NestedScrollView滑动监听兼容低版本的方法
  5. php 遍历 目录,PHP采用自定义函数实现遍历目录下所有文件的方法
  6. moss2010 sharepoint 2010配置人员搜索
  7. oracle dbv 离线,bbed和dbv检查数据文件结果不一致?
  8. java网站开发模式有哪些_第7章JavaWeb常用开发模式.ppt
  9. windows 配置squid反向代理服务器
  10. java懒汉,[Java教程]java 懒汉式
  11. 80端口被占用时的终极解决方法
  12. mongo 4.2版本注意事项
  13. HEX2BIN在WIN7下不能用之后
  14. 芒果TV广告投放的展现样式!芒果TV广告投放如何收费?
  15. Windows7下Foxmail不能使用问题解决一例
  16. 香港地图、行政区划地图辖区边界、沙田
  17. 汇率兑换程序python按温度转换_python复习+实例编写(1)——温度转换、汇率转换...
  18. 全面屏虚拟键适配方案
  19. 实现MapX的移屏测距功能(转)
  20. 完全小白篇-用python爬取豆瓣电影影评

热门文章

  1. 《编译原理-龙书》练习第3章
  2. 根据示波器存储的波形数据得到两列信号的相位差(MATLAB源码)
  3. 示波器观察IIC通讯协议-STM32F4读写24C08EEPROM时序图-新人首更
  4. Asp.Net MVC中身份认证和授权
  5. Meltdown:Reading Kernel Memory from User Space 论文中英对照
  6. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
  7. vue使用CKEditor4编辑器
  8. 用计算机sp画笑脸,用AI技术给名画P上笑脸,看上去整幅画的画风都不好了……...
  9. 基于微信小程序的疫情智慧社区管理系统 计算机毕业设计 后台管理系统
  10. Zxing jar的下载地址