首先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-descredby =“ basic-ws”佔位符=“ game” data-container =“ body” data-placement =“ top” data-content =“鏈接地址不能為空,請填寫”> </div> </div> </div> </div> </div> <button type =“ id button” id =“ id” 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進行前後端的通信了,如果大家還有不明白的或者有更好的方法,可以在下方的留言區討論。 ,可以在下方的留言區討論。