【Spring】-- spring websocket样例
来源:互联网 发布:淘宝火拼 编辑:程序博客网 时间:2024/05/16 12:29
App将做微信小程序的版本了,由于用到了TCP推送,所以需要用websocket实现一遍。利用spring 的websocket来实现还是很简单的。这里有一个非常大的坑,由于我这个是纯只做websocket连接的,想开始将spring mvc给去掉。确怎么也连不上,这里还是需要对websocket的原理知晓一些。它是先走http再走tcp的。所以spring mvc必须要!
spring mvc不在这里讨论。请看socket部分。
bom.xml
<!-- spring 相关 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework.mvc}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${org.springframework.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${org.springframework.version}</version></dependency><dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>${org.springframework.version}</version> </dependency>
spring websocket的核心在于注册。
@Configuration@EnableWebMvc@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{@AutowiredWebSocketHandler webSocketHandler;@AutowiredHandshakeInterceptor handshakeInterceptor;@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {//允许连接的域,只能以http或https开头 必须设置哦,不然会出现403的错误 failed: Error during WebSocket handshake: Unexpected response code: 403// String[] allowsOrigins = {"http://www.xxx.com"}; String[] allowsOrigins = {"*"}; registry.addHandler(webSocketHandler,"/appwebsocket").addInterceptors(handshakeInterceptor).setAllowedOrigins(allowsOrigins); //支持websocket 的访问链接 registry.addHandler(webSocketHandler,"/sockjs/appwebsocket").addInterceptors(handshakeInterceptor).setAllowedOrigins(allowsOrigins).withSockJS(); //不支持websocket的访问链接}}
然后是handshakeInterceptor,这个是握手时需要做的事情。
@Componentpublic class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor{/** * 初次握手访问前 */@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Map<String, Object> attributes) throws Exception {return true;}/** * 初次握手访问后 */@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Exception exception) {}}
然后是WebSocketHandler,这个是所有请求的处理类。
@Component@Scope("prototype")public class WebSocketHandler implements org.springframework.web.socket.WebSocketHandler{private static final Logger log = LoggerFactory.getLogger(WebSocketHandler.class);@AutowiredConfig config;@AutowiredAllConnections allConnections;@AutowiredPushCommandClient pushCommandClient;/** * 初次连接成功 */@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {allConnections.putClientAppIoSession(session);log.info("连接成功。。。添加到链接管理,添加完后当前拥有链接数为:"+allConnections.getAppConnectionSize());}@Overridepublic void handleMessage(WebSocketSession session, WebSocketMessage<?> socketmessage) throws Exception {if (log.isInfoEnabled()) {log.info("app连接:触发handleMessage读取app信息");}if(socketmessage.getPayloadLength()==0){log.info("收到websocket包,包内容为空!!!");return;}JSONObject object = JSON.parseObject(socketmessage.getPayload().toString());//收到json数据,需要处理。。。}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {log.error("链接出错,关闭链接......",exception);if(session.isOpen()){session.close(); }}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { if (log.isInfoEnabled()) {log.info("app连接:触发afterConnectionClosed移除缓存的连接,移除前连接数为:"+allConnections.getAppConnectionSize());}allConnections.removeClientAppIoSession(session);if (log.isInfoEnabled()) {log.info("app连接关闭.channel ID 为:"+session.getId()+" ip:"+session.getRemoteAddress()+",当前剩余设备连接数为:"+allConnections.getAppConnectionSize());}}@Overridepublic boolean supportsPartialMessages() {return false;}}
最后附上一个测试用的客户端代码!
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script> <!-- 新 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> <!-- 可选的Bootstrap主题文件(一般不用引入) --> <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> <!-- jQuery文件。务必在bootstrap.min.js 之前引入 --> <script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> <!--<script type="text/javascript" src="js/jquery-1.7.2.js"></script>--> <!-- 最新的 Bootstrap 核心 JavaScript 文件 --> <script src="http://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <title>webSocket测试</title> <script type="text/javascript"> $(function(){ var websocket; if ('WebSocket' in window) { alert("WebSocket"); websocket = new WebSocket("ws://ip:10000/webtcpnode/appwebsocket"); } else if ('MozWebSocket' in window) { alert("MozWebSocket"); websocket = new MozWebSocket("ws://webtcpnode/appwebsocket"); } else { alert("SockJS"); websocket = new SockJS("http://127.0.0.1/webtcpnode/sockjs/appwebsocket/"); } websocket.onopen = function (evnt) { $("#tou").html("链接服务器成功!") }; websocket.onmessage = function (evnt) { $("#msg").html($("#msg").html() + "<br/>" + evnt.data); }; websocket.onerror = function (evnt) { }; websocket.onclose = function (evnt) { $("#tou").html("与服务器断开了链接!") } $('#send').bind('click', function() { send(); }); function send(){ if (websocket != null) { var message = document.getElementById('message').value; websocket.send(message); } else { alert('未与服务器链接.'); } } }); </script></head><body><div class="page-header" id="tou"> webSocket及时聊天Demo程序</div><div class="well" id="msg"></div><div class="col-lg"> <div class="input-group"> <input type="text" class="form-control" placeholder="发送信息..." id="message"> <span class="input-group-btn"> <button class="btn btn-default" type="button" id="send" >发送</button> </span> </div><!-- /input-group --></div><!-- /.col-lg-6 --></div><!-- /.row --></body></html>
0 0
- 【Spring】-- spring websocket样例
- Spring WebSocket
- spring websocket
- spring websocket
- WebSocket Spring
- Spring WebSocket
- Spring WebSocket初探1 (Spring WebSocket入门教程)
- Spring WebSocket初探1 (Spring WebSocket入门教程)
- Spring WebSocket初探2 (Spring WebSocket入门教程)
- Spring WebSocket初探2 (Spring WebSocket入门教程)
- spring-websocket demo1
- spring-websocket demo2
- spring整合webSocket
- Spring websocket 使用
- websocket与Spring整合
- spring+websocket整合使用
- spring对WebSocket支持
- 【spring+websocket的使用】
- 第九章 银行
- ms16_032系统提权
- SameTree解法思路及源代码
- D.Marr视觉理论
- Android PreferenceFragment
- 【Spring】-- spring websocket样例
- 10分钟学会缓存redis
- msfvenom反弹
- 【程序】STM32单片机操作ST93C46存储器的程序(3.2V电压)
- Linux守护进程
- 手把手教你制作linux U盘启动盘及安装Ubuntu与win7双系统
- msf生成安卓渗透
- java swing flowlayou 方式
- 数据库的导出指令