文档章节

Sping WebSocket SockJS使用

王福林
 王福林
发布于 2017/03/28 13:26
字数 679
阅读 94
收藏 1

注意点:

1、Spring Framework从4.0版本开始支持websocket,示例代码使用的是4.1.3

2、SockJs是一个封装的WebSocket实现,可以支持低版本的IE浏览器。

3、SockJs+Spring-WebSocket时,由于SockJs与Spring WebSocket之间采用JSON通讯,需要引入jackson 2的相关jar包。

4、项目需要使用到Spring MVC。

 

具体代码实现(小例子):

1、Spring WebSocket配置类

Java代码 

 收藏代码

  1. package com.watcher.websocket.spring;  
  2.   
  3. import org.springframework.context.annotation.Bean;  
  4. import org.springframework.context.annotation.Configuration;  
  5. import org.springframework.web.socket.config.annotation.EnableWebSocket;  
  6. import org.springframework.web.socket.config.annotation.WebSocketConfigurer;  
  7. import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;  
  8.   
  9. @Configuration  //配置类  
  10. @EnableWebSocket  //声明支持websocket  
  11. public class WebSocketConfig implements WebSocketConfigurer{  
  12.   
  13.     @Override  
  14.     public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  
  15.   
  16.         //注册websocket实现类,指定参数访问地址;allowed-origins="*" 允许跨域  
  17.         registry.addHandler(myHandler(), "/ws").addInterceptors(myHandshake()).setAllowedOrigins("*");  
  18.         //允许客户端使用SockJS  
  19.         registry.addHandler(myHandler(), "/sockjs/ws").addInterceptors(myHandshake()).withSockJS();  
  20.     }  
  21.       
  22.     @Bean  
  23.     public MyHandler myHandler(){  
  24.         return new MyHandler();  
  25.     }  
  26.   
  27.     @Bean  
  28.     public MyHandshakeInterceptor myHandshake(){  
  29.         return new MyHandshakeInterceptor();  
  30.     }  
  31.       
  32.   
  33. }  

 

2、Handler类实现(用于处理具体的消息)

Java代码 

 收藏代码

  1. package com.watcher.websocket.spring;  
  2.   
  3. import org.springframework.web.socket.CloseStatus;  
  4. import org.springframework.web.socket.TextMessage;  
  5. import org.springframework.web.socket.WebSocketHandler;  
  6. import org.springframework.web.socket.WebSocketMessage;  
  7. import org.springframework.web.socket.WebSocketSession;  
  8.   
  9. //extending either TextWebSocketHandler orBinaryWebSocketHandler  
  10. public class MyHandler implements WebSocketHandler {  
  11.       
  12.       
  13.   
  14.     @Override  
  15.     public void afterConnectionClosed(WebSocketSession arg0, CloseStatus arg1) throws Exception {  
  16.         // TODO Auto-generated method stub  
  17.           
  18.         System.out.println("Connection closed..."+arg0.getRemoteAddress().toString());  
  19.           
  20.     }  
  21.   
  22.     @Override  
  23.     public void afterConnectionEstablished(WebSocketSession arg0) throws Exception {  
  24.         // TODO Auto-generated method stub  
  25.         System.out.println("Connection established..."+arg0.getRemoteAddress().toString());  
  26.     }  
  27.   
  28.     @Override  
  29.     public void handleMessage(WebSocketSession arg0, WebSocketMessage<?> arg1) throws Exception {  
  30.         // TODO Auto-generated method stub  
  31.          try {  
  32.              System.out.println("Req: "+arg1.getPayload());  
  33.             TextMessage returnMessage = new TextMessage(arg1.getPayload()    
  34.                       + " received at server");    
  35.              arg0.sendMessage(returnMessage);  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }    
  39.     }  
  40.   
  41.     @Override  
  42.     public void handleTransportError(WebSocketSession arg0, Throwable arg1) throws Exception {  
  43.         // TODO Auto-generated method stub  
  44.         if(arg0.isOpen()){  
  45.             arg0.close();  
  46.         }  
  47.         System.out.println(arg1.toString());  
  48.         System.out.println("WS connection error,close...");  
  49.     }  
  50.   
  51.     @Override  
  52.     public boolean supportsPartialMessages() {  
  53.         // TODO Auto-generated method stub  
  54.         return false;  
  55.     }  
  56.   
  57.       
  58.       
  59. }  

 3、握手拦截器实现(拦截器...)

Java代码 

 收藏代码

  1. package com.watcher.websocket.spring;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import org.springframework.http.server.ServerHttpRequest;  
  6. import org.springframework.http.server.ServerHttpResponse;  
  7. import org.springframework.web.socket.WebSocketHandler;  
  8. import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;  
  9.   
  10. /** 
  11.  *  
  12.  * 类描述:握手拦截器 
  13.  * com.watcher.websocket.spring  MyHandshakeInterceptor 
  14.  * Created by 78098 on 2016年11月15日. 
  15.  * version 1.0 
  16.  */  
  17. public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{  
  18.   
  19.     @Override  
  20.     public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {  
  21.         // TODO Auto-generated method stub  
  22.         System.out.println("After handshake "+request.getRemoteAddress().toString());  
  23.         super.afterHandshake(request, response, wsHandler, ex);  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Map<String, Object> map) throws Exception {  
  28.         // TODO Auto-generated method stub  
  29.         System.out.println("Before handshake "+request.getRemoteAddress().toString());  
  30.         return super.beforeHandshake(request, response, handler, map);  
  31.     }  
  32.   
  33.       
  34.       
  35. }  

 4、页面

Html代码 

 收藏代码

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta charset="UTF-8">  
  5. <title>Insert title here</title>  
  6. <script type="text/javascript" src="./plugin/sockjs/sockjs-1.1.1.js"></script>  
  7. <script type="text/javascript">  
  8.     var url = "192.168.120.37:8080/springMybatis";  
  9.     var websocket = null;  
  10.     if ('WebSocket' in window) {  
  11.         websocket = new WebSocket("ws://" + url + "/ws");  
  12.     } else {  
  13.         websocket = new SockJS("http://" + url + "/sockjs/ws");  
  14.     }  
  15.     websocket.onopen = onOpen;  
  16.     websocket.onmessage = onMessage;  
  17.     websocket.onerror = onError;  
  18.     websocket.onclose = onClose;  
  19.   
  20.     function onOpen(openEvent) {  
  21.         document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "OPEN<br/>";  
  22.     }  
  23.   
  24.     function onMessage(event) {  
  25.         document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ event.data+"<br/>";  
  26.     }  
  27.     function onError() {  
  28.     }  
  29.     function onClose() {  
  30.         document.getElementById("console").innerHTML = document.getElementById("console").innerHTML+ "CLOSE<br/>";  
  31.     }  
  32.   
  33.     function doSend() {  
  34.         console.log(websocket.readyState);  
  35.         if (websocket.readyState == SockJS.OPEN) {  
  36.             var msg = document.getElementById("message").value;  
  37.             websocket.send(msg);  
  38.         } else {  
  39.             alert("连接失败!");  
  40.         }  
  41.     }  
  42.       
  43.       
  44.     function disconnect(){  
  45.         if (websocket != null) {  
  46.             websocket.close();  
  47.             websocket = null;  
  48.         }  
  49.     }  
  50.       
  51.     function reconnect(){  
  52.         if (websocket != null) {  
  53.             websocket.close();  
  54.             websocket = null;  
  55.         }  
  56.         if ('WebSocket' in window) {  
  57.             websocket = new WebSocket("ws://" + url + "/ws");  
  58.         } else {  
  59.             websocket = new SockJS("http://" + url + "/sockjs/ws");  
  60.         }  
  61.         websocket.onopen = onOpen;  
  62.         websocket.onmessage = onMessage;  
  63.         websocket.onerror = onError;  
  64.         websocket.onclose = onClose;  
  65.     }  
  66. </script>  
  67. </head>  
  68. <body>  
  69.     <div>  
  70.         <button id="disconnect" onclick="disconnect()">断开连接</button>  
  71.         <button id="send" onclick="doSend()">发送消息</button>  
  72.         <button id="reconnect" onclick="reconnect()">重新连接</button>  
  73.     </div>  
  74.     <div>  
  75.        <textarea id="message" style="width: 350px">Here is a message!</textarea>  
  76.     </div>  
  77.     <div>日志信息:</div>  
  78.     <p id="console" width="600px"></p>  
  79. </body>  
  80. </html>  

© 著作权归作者所有

王福林
粉丝 10
博文 94
码字总数 37444
作品 0
徐汇
程序员
私信 提问
Spring消息之WebSocket

一、WebSocket简介 WebSocket 的定义?WebSocket是HTML5下一种全双工通信协议。在建立连接后,WebSocket服务器端和客户端都能主动的向对方发送和接收数据,就像Socket一样。 WebSocket 的由来...

jmcui
2018/05/06
0
0
在vue中使用SockJS实现webSocket通信

最近接到一个业务需求,需要做一个聊天信息的实时展示的界面,这就需要和服务器端建立webSocket连接,从而实现数据的实时获取和视图的实时刷新.在此将我的实现记录下来,希望可以给有同样需求的人...

慢思考快行动
2018/08/28
0
0
日志工具 - boot-websocket-log

boot-websocket-log spring boot系统中使用websocket技术实时输出系统日志到浏览器端 本项目使用如下相关技术: 1.websocket技术:WebSocket(stopmp服务端),stomp协议,sockjs.min.js,s...

KL博客
2018/08/24
2.2K
1
对于不支持websocket的采用何种方式替代?ScokJs

用tomcat作为服务器端,客户端浏览器支持就直接采用websocket,但有些客户端浏览器不支持,采用什么方式替代好呢,用了sockJs,怎么不起作用了? var sock = new SockJS("/msgChannel"); sock...

阿森lin1991
2014/09/19
2.8K
2
WEB聊天室开发相关调研

最近有需求要做一套在线聊天系统(图文),看了一些有Ajax,websocket,sockJS,socket.io…… 预计1000人在线,Ajax直接排除,websocket是H5新出的,浏览器兼容性很差IE10+才支持,后面sockJ...

郏高阳
2016/10/21
426
6

没有更多内容

加载失败,请刷新页面

加载更多

一、docker 入坑(win10和Ubuntu 安装)

前言 终究还是绕不过去了,要学的知识真的是太多了,好在我们还有时间,docker 之前只闻其声,不曾真正的接触过,现在docker 越来越火,很多公司也都开始使用了。所以对于我们程序员而言,又...

quellanan2
刚刚
0
0
AutoCompleteTextView

小技巧按菜单键 当菜单打开之前会调用onMenuOpened(int featereId,Menu menu),可以重写这个方法,弹出对话框或者Popmenu 再布局中添加控件AutoCompleteTextView. <AutoCompleteTextVie...

逆天游云
3分钟前
0
0
谷歌软件商店:推出5美元会员 可用数百个软件

腾讯科技讯,谷歌和苹果是全球两大智能手机操作系统的运营者,两家公司旗下分别拥有占据行业垄断地位的谷歌软件商店和苹果软件商店。据外媒最新消息,手机软件商店的商业模式正在发生一些变化...

linuxCool
26分钟前
1
0
RocketMQ 多副本前置篇:初探raft协议

Raft协议是分布式领域解决一致性的又一著名协议,主要包含Leader选举、日志复制两个部分。 温馨提示: 本文根据raft官方给出的raft动画进行学习,其动画展示地址:http://thesecretlivesofda...

中间件兴趣圈
26分钟前
1
0
elasticsearch 6.8.0 添加认证

1. 修改elasticsearch-6.8.0/config/elasticsearch.yml 最后添加一行:xpack.security.enabled: true 2. 初始化用户和密码 ./bin/elasticsearch-setup-passwords interactive 我这里初始化为......

coord
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部