websocket例子 springboot,websocket开发即时通讯

  websocket例子 springboot,websocket开发即时通讯

  

目录

1、引入依赖2、WebSocketConfig开启WebSocket3、WebSocketServer4、测试连接发送和接收消息5、在线测试地址6、测试截图

 

  

1、引入依赖

dependencygroupidorg。spring框架。boot/groupid artifactId spring-boot-starter-web socket/artifactId/dependencydependencycgroupidorg。lombok项目/groupid artifactId/dependencydependencycgroupid com。阿里巴巴/groupid artifactidfastjson/artifactid version 1。2 .3/版本/依赖关系

 

  

2、WebSocketConfig 开启WebSocket

包com。舒茶。deveiface。网络。配置;/* * * * @作者tqf * @描述* @版本1.0 * @自2022-04-12 15:35 */进口机构。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;导入组织。spring框架。网络。插座。服务器。标准。servendpointexporter/** * 开启web套接字*/@配置公共类WebSocketConfig { @ Bean public ServerEndpointExporter ServerEndpointExporter(){ return new ServerEndpointExporter();}}

 

  

3、WebSocketServer

包com。舒茶。deveiface。网络。ws;/* * * * @作者tqf * @描述* @版本1.0 * @自2022-04-12 15:33 */导入龙目岛。外部人员。SLF 4j。SLF 4j;导入org。spring框架。刻板印象。组件;导入org。spring框架。网络。插座。websocketsession导入javax。web套接字。*;导入javax。web套接字。服务器。路径参数;导入javax。web套接字。服务器。服务器端点;导入Java。util。ArrayList导入Java。util。收藏;导入Java。util。列表;导入Java。util。并发。并发hashmap导入Java。util。并发。copyonwritearrayset@ Component @ server endpoint(/web socket/{ userId } )@ SLF 4j公共类web socket server { private Session Session;私有字符串userId/**静态变量,用来记录当前在线连接数。应该把它设计成线程安全的.私有静态int online count=0;private static CopyOnWriteArraySetWebSocketServer webSocketSet=new CopyOnWriteArraySet();/** *并发包的线程安全设置,用来存放每个客户端对应的MyWebSocket对象*/私有静态并发哈希映射

 

  ring,WebSocketServer> webSocketMap = new ConcurrentHashMap(); /** * 为了保存在线用户信息,在方法中新建一个list存储一下【实际项目依据复杂度,可以存储到数据库或者缓存】 */ private final static List<Session> SESSIONS = Collections.synchronizedList(new ArrayList<>()); /** * 建立连接 * @param session * @param userId */ @OnOpen public void onOpen(Session session, @PathParam("userId") String userId) { this.session = session; this.userId = userId; webSocketSet.add(this); SESSIONS.add(session); if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); webSocketMap.put(userId,this); } else { webSocketMap.put(userId,this); addOnlineCount(); } // log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size()); log.info("[连接ID:{}] 建立连接, 当前连接数:{}", this.userId, webSocketMap.size()); } /** * 断开连接 */ @OnClose public void onClose() { webSocketSet.remove(this); if (webSocketMap.containsKey(userId)) { webSocketMap.remove(userId); subOnlineCount(); } // log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size()); log.info("[连接ID:{}] 断开连接, 当前连接数:{}", userId, webSocketMap.size()); } /** * 发送错误 * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.info("[连接ID:{}] 错误原因:{}", this.userId, error.getMessage()); error.printStackTrace(); } /** * 收到消息 * @param message */ @OnMessage public void onMessage(String message) { // log.info("【websocket消息】收到客户端发来的消息:{}", message); log.info("[连接ID:{}] 收到消息:{}", this.userId, message); } /** * 发送消息 * @param message * @param userId */ public void sendMessage(String message,Long userId) { WebSocketServer webSocketServer = webSocketMap.get(String.valueOf(userId)); if (webSocketServer!=null){ log.info("【websocket消息】推送消息, message={}", message); try { webSocketServer.session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); log.error("[连接ID:{}] 发送消息失败, 消息:{}", this.userId, message, e); } } } /** * 群发消息 * @param message */ public void sendMassMessage(String message) { try { for (Session session : SESSIONS) { if (session.isOpen()) { session.getBasicRemote().sendText(message); log.info("[连接ID:{}] 发送消息:{}",session.getRequestParameterMap().get("userId"),message); } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取当前连接数 * @return */ public static synchronized int getOnlineCount() { return onlineCount; } /** * 当前连接数加一 */ public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } /** * 当前连接数减一 */ public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } }

 

  

4、测试连接发送和接收消息

package com.shucha.deveiface.web.controller; import com.alibaba.fastjson.JSONObject;import com.shucha.deveiface.web.ws.WebSocketServer;import lombok.Data;import lombok.experimental.Accessors;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; /** * @author tqf * @Description * @Version 1.0 * @since 2022-04-12 15:44 */@RestController@RequestMapping("/web")public class TestWebSocket { @Autowired private WebSocketServer webSocketServer; /** * 消息发送测试 */ @GetMapping("/test") public void test(){ for (int i=1;i<4;i++) { WebsocketResponse response = new WebsocketResponse(); response.setUserId(String.valueOf(i)); response.setUserName("姓名"+ i); response.setAge(i); webSocketServer.sendMessage(JSONObject.toJSONString(response), Long.valueOf(String.valueOf(i))); } } /** * 群发消息测试(给当前连接用户发送) */ @GetMapping("/sendMassMessage") public void sendMassMessage(){ WebsocketResponse response = new WebsocketResponse(); response.setUserName("群发消息模板测试"); webSocketServer.sendMassMessage(JSONObject.toJSONString(response)); } @Data @Accessors(chain = true) public static class WebsocketResponse { private String userId; private String userName; private int age; }}

 

  

5、在线测试地址

websocket 在线测试

 

  

 

  

6、测试截图

访问测试发送消息:http://localhost:50041//web/test

 

  测试访问地址:ws://192.168.0.115:50041/webSocket/1 wss://192.168.0.115:50041/webSocket/2

  

 

  

 

  

 

  到此这篇关于SpringBoot实现WebSocket即时通讯的示例代码的文章就介绍到这了,更多相关SpringBoot WebSocket即时通讯内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: