# rangers-websocket **Repository Path**: venfu/rangers-websocket ## Basic Information - **Project Name**: rangers-websocket - **Description**: sping boot 跟websock整合 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-05-25 - **Last Updated**: 2020-12-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #1.注入依赖 org.springframework.boot spring-boot-starter-websocket #2.配置:开启STOMP协议传输代理消息 /** * 配置websocket节点 * * @version 1.5 * @author fuhw */ @Configuration @EnableWebSocketMessageBroker public class WebSocketPointConfig extends AbstractWebSocketMessageBrokerConfigurer { /** * 注册消息节点 */ @Override public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { stompEndpointRegistry.addEndpoint("/registryPoint").withSockJS(); } /** * 配置消息代理:路径"/topic" */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); } } #3.配置websocket-ms.html的路径映射 /** * 配置视图处理器 * * @version 1.5 * @author fuhw */ @Configuration public class WebSocketViewConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/websocket-msg").setViewName("/websocket-msg"); } } #4.广播消息 /** * 广播消息ctrl * * @version 1.5 * @author fuhw */ @Controller public class PublishMsgController { private static int starCount = 1; @MessageMapping("/publish/msg") @SendTo("/topic/getResponse")//订阅地址 public ResponseMessage say(RequestMessage message) { System.err.println("cur-star-count:" + starCount); return new ResponseMessage("welcome,xiaolang ---- " + starCount++ + " !"); } } #二.双向通信 1.注入ServerEndpointExporter,这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint @Bean public ServerEndpointExporter serverEndpointExporter (){ return new ServerEndpointExporter(); } 2.服务端: @ServerEndpoint("/publish") @Component public class MyWebSocketService { private static int onlineCount = 0; private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); private Session session; @OnOpen public void onOpen(Session session) { this.session = session; webSocketSet.add(this); addOnlineCount(); System.out.println("有新链接加入!当前在线人数为" + getOnlineCount()); } @OnClose public void onClose() { webSocketSet.remove(this); subOnlineCount(); System.out.println("有一链接关闭!当前在线人数为" + getOnlineCount()); } @OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("来自客户端的消息:" + message); // 群发消息 if(!webSocketSet.isEmpty()) { for (MyWebSocketService item : webSocketSet) { item.sendMessage(message); } } } public void sendMessage(String message) throws IOException { if(!webSocketSet.isEmpty()) { webSocketSet.stream().forEach(temp->{ try { temp.session.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } }); } } public static synchronized int getOnlineCount() { return MyWebSocketService.onlineCount; } public static synchronized void addOnlineCount() { MyWebSocketService.onlineCount++; } public static synchronized void subOnlineCount() { MyWebSocketService.onlineCount--; } } 3.客户端 var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket("ws://192.168.1.116:8080/publish"); } else { alert('Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function () { setMessageInnerHTML("error"); }; //连接成功建立的回调方法 websocket.onopen = function (event) { setMessageInnerHTML("open"); } //接收到消息的回调方法 websocket.onmessage = function (event) { setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function () { setMessageInnerHTML("close"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { websocket.close(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '
'; } //关闭连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); }