一、引入websocket依赖
1 2 | org.springframework.boot spring-boot-starter-websocket |
二、WebSocket配置
1 2 3 4 5 6 7 | @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } |
三、WebSocket服务
(前端连接地址ws://ip:端口/websocket,请自行替换ip、端口和接口名称)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | @ServerEndpoint (value = "/websocket" ) @Component public class WebSocketServer { private final static Logger log = LoggerFactory.getLogger(WebSocketServer. class ); //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 private static int onlineCount = 0 ; //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session) { this .session = session; //加入set中 webSocketSet.add( this ); //在线数加1 addOnlineCount(); log.info( "有新连接加入!当前在线人数为" + getOnlineCount()); try { sendMessage( "连接成功" ); } catch (IOException e) { log.error( "websocket IO异常" ); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { //从set中删除 webSocketSet.remove( this ); //在线数减1 subOnlineCount(); log.info( "有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session) { log.info( "来自客户端的消息:" + message); //群发消息 for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } /** * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error( "发生错误" ); error.printStackTrace(); } public void sendMessage(String message) throws IOException { this .session.getBasicRemote().sendText(message); } /** * 群发自定义消息 */ public static void sendInfo(String message) throws IOException { log.info(message); for (WebSocketServer item : webSocketSet) { try { item.sendMessage(message); } catch (IOException e) { continue ; } } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketServer.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } } |
四、消息推送
后端调用WebServer的sendInfo接口(例如:WebSocketServer.sendInfo(“Hello World”);)实现主动向前端推送消息
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。