首先pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.8.RELEASE</version></parent><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</a rtifactId></dependency><dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.0</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</group id> <ARTIFACTID> spring-websocke </artifactid> </depentency> <dependency> <groupId> org.springframework.boot.boot </groupId> <Artifactid> spring-boot-starter-starter-web </artifactid> groupId> <ArtifactId> spring-boot-starter-tomcat </artifactid> </dextusion> </exclusions> </depentency> <groudency> <groupId> org.springframework.boot </groupId> </groupId> <ARTIFACTID> <ARTIFACTID> spring-boot-boot-str-boot-Starter-Starter-Starter-Starter-undertow </artifactid </artifactid </artifactid </artifactid> </依赖关系>
接收消息后的处理类GameHandler:
导入java.net.uri; import org.springframework.web.socket.binarymessage; import org.springframework.web.socket.closestatus; impport org.springframework.web.socket.web.socket.web.socket.pongmeskage.pongmeskage; org.springframework.web.socket.WebSocketSession;import org.springframework.web.socket.handler.AbstractWebSocketHandler;public class GameHandler extends AbstractWebSocketHandler { /** * 处理字符串类的信息 * * @param session * @param message * @throws Exception */ @Override protected void handleTextMessage(WebSocketSession session, TextMessage消息引发异常{session.sendMessage(new TextMessage(message.asbytes())); } / ** * * * * * * @param会话 * @param消息 * @throws exception * / @override protected void handlebinarymessage(websocketsession session,binarymessage session,binarymessage message)抛出异常{session.sendMessage(sendMessage(new BinaryMessage)(new BinaryMessage(new BinaryMessage) } / ** * ping-pong * * @param session * @param消息 * @throws异常 * / @override protected void handlepongMessage(websocketsessessessession session,pongmessage session,pongmessage message)抛出异常{} / ** ** *传出错误的处理 *传出错误的处理抛出异常{} / ** * * * * * @param会话 * @param状态 * @throws异常 * / @override public void afterConnectionClosed(WebSocketSession session,coldestatus stection,coldestatus status)抛出异常{} / ** ** * @param Sessign * @param sessign * @throws @throws excress * / @override public viodection extreste {throsectecteant extreste {握手信息拦截器websockethandshakeinterceptor:
导入java.util.map; import javax.servlet.http.cookie; import org.springframework.http.server.server.serverhttprequest; import org.springframework.htttp.server.serverhttp.serverhttpprespspons; org.springframework.http.server.ServletServerHttpRequest;import org.springframework.web.socket.WebSocketHandler;import org.springframework.web.socket.server.HandshakeInterceptor;public class WebSocketHandshakeInterceptor implements HandshakeInterceptor { @Override public boolean hardshake(serverhttprequest请求,serverhttpresponse shr1,websockethandler wsh,map <string,object>属性)抛出异常{// return true; } @Override public void AfterHandshake(serverhttprequest SHR,serverhttpresponse shr1,websockethandler wsh,exception excptn){}}}使用websocket的配置类websocketConfig:
导入org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframewramework.web.servlet.web.servlet.config.config.annotation.webmvcconfigurerAdapter; org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublic class WebSocketConfig扩展WebMVCCONFIGURERADAPTERSTENT启动WebSocketConfigurer {@Override public void registerWebsockEthandlers(websockethandlerRegistry registry registry registry){//允许连接的域,只能以http或http或http或httpshttps https https fline [] “ http:// localhost:1213”}; registrister.addhandler(gameHandler(),“/game”)。addinterceptors(handshakeinterceptor())。setAllowAllowEdorigins(labereorigins); } @bean public gameHandler gameHandler(){返回new GameHandler(); } @bean public weblesockethandshakeinterceptor hernshakeinterceptor(){返回新的WebSockEthandShakeInterceptor(); }}}启动类发射器:
@springbootapplicationpublic类启动器{public static void main(string [] params){springapplication.run(launcher.class,params);}}}配置文件主要/资源/应用程序。专业:
server.port = 1213server.Session timeout = 1800server.undertow.io-threads = 4sertow.undertow.undertow.worker-threads = 20server.undertow.undertow.buffer-size = 1024Size = 1024Server.underTow.UnderTow.buffers-per-region-per-Region = 1024Server.undertow.undertow.druce.druce.direct-buffers = 1024Server.undertow.drimect-buffers =
前端的测试页面主/资源/静态/index.html
<!doctype html> <html lang =“ zh-cn”> <head> <head> <meta charset =“ utf-8”> <meta http-equiv =“ x-ua-compatible” x-ua-compatible“ content =” ie = edge“ ie =” ie = <meta name =“ viewport” href =“ https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css” rel =“外部nofollow” rel =“ stylesheet”> <! - <link href =“ https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.min.min.css” rel =“外部nofollow nofollow” rel =“ stylesheet”> - > <script src =“ <script src =“ https://cdn.bootcss.com/jquery-scrollto/2.1.2/jquery.scrollto.min.js”> </script> </script> <script src =“ https://cdnjs.cloudflare.clare.clare.com/ajax/ajax/ajax/libs/libs/libs/libs/pako/pako/pako/pako/1.6/pako/1.6.6/pakol.1.6.min> <! - [如果lt IE 9]> <script src =“ https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js> </script> <script src =“ https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js”> </script> <![endif] - > <style> <syte> #message {height {height {height:600px;溢出Y:自动; } </style> </head> <body> <div> <h1> websocket测试页面</h1> <hr/> <hr/> <div> <div> <div> <label for =“ wsaddr”> websocket地址:</label> <span ID =“ basic-ws”> ws> ws:ws:ws:> ws:///127.0.0.0.0.1:1213/spand dextdr> basindr aria-describedby="basic-ws" placeholder="game" data-container="body" data-placement="top" data-content="链接地址不能为空,请填写"> </div> </div> <button type="button" id="btnConnect" onclick="connect();"> <span aria-hidden="true"></span> 连接 </button> <button type="button" id =“ btnclose” disabled =“ disabled” onclick =“ collectwebsocket();”> <span aria-hidded =“ true”> </span> </span> </button> <button> <button> <button type =“ button” id =“ btnsend” disabled“ disabled” disabled =“ disabled” disabled =“ disabled” style =“ margin-left:50px; 50px;” onclick =“ send();”> <span aria-hidded =“ true”> </span> </button> </div> </div> <br/> <textarea id =“ inmsg” rows =“ 5” 5“占位符=”在这里输入需要发送的信息...> </textarea> <hr/> <hr/> <hr/> <hr/> <hr/> <hr/> src =“ https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js”> </script> <script> <script> <script type =“ text/javascript”> function zip(str)返回btoa(二进制串); }函数unzip(b64data){var strdata = atob(b64data); var chardata = strdata.split('')。map(function(x){return x.charcodeat(0);}); var bindata = new uint8array(chardata); var data = pako.inflate(bindata); strdata = string.fromcharcode.apply(null,new uint16array(data));返回strdata; } var websocket = null; var wsbaseurl = null; var wsurl = null;函数init(){wsbaseurl =“ ws://” + window.location.host +“/”; $(“#Basic-ws”)。文本(WSBASEURL); $(function(){$('[data-toggle =“ popover”]')。popover();});返回false; } //关闭websocket连接函数collectwebsocket(){if(websocket){websocket.close(); }返回false; } //将消息显示在网页上函数setMessageInnerhtml(who,msg){var message = null; if(who === 1){message ='<div remo =“ arter”>本地:' + msg +'</div>'; } else {message ='<div cool =“ arter”>服务器:' + msg +'</div>'; } document.getElementById('message').InnerHtml =(document.getElementById('message')。innerhtml + message); $(“#消息”)。scrollto('100%');返回false; } //发送消息函数send(){if(websocket){var message = $(“#inmsg”)。val(); websocket.send(zip(message)); setMessageInnerHtml(1,消息); }返回false; } function connect(){var url = $(“#basic-ws-addr”)。val(); if(url.length <= 0){$('#Basic-ws-addr')。popover('show'); settimeout(function(){$('#Basic-ws-addr')。popover('hide');},3000); } else {wsurl = wsbaseurl + url;如果(窗口中的'WebSocket'){websocket = new WebSocket(wsurl); //连接发生错误的回调方法websocket.onError = function(){setMessageInnerhtml(0,“ websocket-->” + wsurl); $(“#btnConnect”)。removeAttr(“ disabled”); $(“#btnclose”)。attr(“禁用”,“禁用”); $(“#btnsend”)。attr(“禁用”,“禁用”); }; //连接成功建立的回调方法websocket.onopen = function(){setMessageInnerhtml(0,“ websocket连接成功->” + wsurl); $(“#btnConnect”)。attr(“禁用”,“禁用”); $(“#btnclose”)。removeAttr(“禁用”); $(“#btnsend”)。removeAttr(“ disabled”); }; //接收到消息的回调方法websocket.onmessage = function(event){setMessageInnerhtml(0,unzip(event.data)); }; //连接关闭的回调方法websocket.onclose = function(){setMessageInnerhtml(0,“ websocket-->” + wsurl); $(“#btnConnect”)。removeAttr(“ disabled”); $(“#btnclose”)。attr(“禁用”,“禁用”); $(“#btnsend”)。attr(“禁用”,“禁用”); }; //监听窗口关闭事件,当窗口关闭时,主动去关闭,websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function(){closewebsocket(); }; } else {alert('不支持WebSocket'); }}返回false; } window.onload = init(); </script> </body> </html>到此就可以使用websocket进行前后端的通信了,如果大家还有不明白的或者有更好的方法,可以在下方的留言区讨论。,可以在下方的留言区讨论。