pom.xml
<부모> <groupid> org.springframework.boot </groupid> <artifactid> Spring-boot-starter-parent </artifactid> <bersion> 1.5.8. release </version> </parent> <groupid> org.apache.commons <artifactid> commons-io </a rtifactid> </dependency> <pectinement> <groupid> javax.websocket </groupid> <artifactid> javax.websocket-api </artifactid> <0 </version> <scope> 제공 </scope> </specop> </specop> </scope> </scope> </scope> </scope> </scope> </scope> </scope> </scope> </scope> <guplency> <groupid> org.springframework </group id> <artifactid> spring-websocket </artifactid> </fectionency> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> <exclusions> <groupid> org.springframework.boot.boot. GroupId> <artifactid> Spring-Boot-Starter-Tomcat </artifactid> </exclusion> </exclusions> </fexendency> <pectionency> <groupid> org.springframework.boot </groupid> <artifactid> 스프링 부트 스타터-undertow </artifactid> </delation>
接收消息后的处理类 게임 핸들러 :
import java.net.uri; import org.springframework.web.socket.binarymessage; import org.springframework.web.socket.closestatus; import org.springframework.web.socket.pongmessage; import org.springframework.swetke.textmessage; 가져 오기; org.springframework.web.socket.websocketsession; import org.springframework.web.socket.handler.abstractwebsockethethandler; public class gamehandler 확장 Abstractwebsockethedandler { / ** * 处理字符串类的信息 * * @param 세션 * @param 메시지 * / @Throws Propertection Void Handlextmessage, TextMessage Message) 예외 {session.sendMessage (new TextMessage (message.asbytes ())); } / ** * * * @param session * @param 메시지 * @Throws Exception * / @override protected void handinaryMessage (websocketSession session, binarymessage message) 예외 {session.sendMessage (new binaryMessage (message.getPayLoad ()); } / ** * ping-pong * * @param session * @param 메시지 * @throws 예외 * / @override protected void handspongmessage (websocketsession session, pongmessage message) 예외 {} / ** * * * * @param 세션 * @param 예외 * / @throws public vordransporer (sockocketsestion volletransporer) {} / ** * * * * @param session * @param status * @param status * @throws 예외 * / @override public void afterconnectionClosed (websocketSession session, closeStatus status) 예외 {} / ** * * @param 세션 * @Throws 예외 * / @Override void afterConnectionStablish (websocketSession session)}}}}握手信息拦截器 websockethandshakeinterceptor :
import java.util.map; import javax.servlet.http.cookie; import org.springframework.http.server.serverhttprequest; import org.springframework.http.server.serverhtttprespons; 가져 오기 org.springframework.http.server.servletserververhttprequest; import org.springframework.web.socket.websockethandler; import org.springframework.web.socket.server.handshakeinterceptor; public websockethandshakeinterceptor and shake intercectors intercectors intercectors intercectors intercector 사전 핸드 셰이크 (ServerHttPrequest 요청, ServerHttPresponse SHR1, WebSocketHandler WSH, Map <String, Object> Attributes)는 예외 {// 此处可以做一些权限认证的事情或者其他 return true; } @override public void aquhandshake (serverhttprequest shr, serverhttpresponse shr1, websockethandler wsh, exception excptn) {}}Websocket 的配置类 WebSocketConfig :
import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.spramework.web.servlet.config.annotation.webmvcconfigureradapter; import org.springframework.weetch.socket.cocket.cocket.onfocket.endecocket org.springframework.web.socket.config.annotation.websocketconfigurer; import org.springframework.web.socket.config.annotation.websockethandlerregistry;@configuration@configuration@enablewebsocketpublic classeCocketConfig webMvcConfigerAdapter webMVCCONFIGERADAPTER IMPLEMESS IMPLEMENTS CONFIGORE CONFIGORE CONFIGORE CONFIGOREC CONFIGURATION. registerwebsockethandlers (WebsockethandlerRegistry Registry) {// 允许连接的域, 只能以 http 或 https 开头 开头 string [] alenlisorigins = { "http://127.0.0.1:1213", "http : // localhost : 1213"}; registry.addhandler (GameHandler (), "/Game"). AddInterceptors (handshakeinterceptor ()). setallowedorigins (허용); } @Bean public GameHandler GameHandler () {return new GameHandler (); } @bean public websockethandshakeinterceptor handshakeinterceptor () {return new websockethandshakeinterceptor (); }}启动类 런처 :
@SpringBootApplicationPublic Class Launcher {public static void main (String [] params) {springApplication.Run (unkener.class, params);}}main/resources/application.properties :
Server.port = 1213server.session-timeout = 1800server.undertow.io-threads = 4server.undertow.worker-threads = 20server.undertow.buffer-size = 1024server.undertow.buffers-per-periregion = 1024server.undertow.direct-buffers = 진실합니다
main/resources/static/index.html
<! docType html> <html lang = "zh-cn"> <head> <meta charset = "utf-8"> <meta http-equiv = "x-ua-catsible"content = "ie get"> <meta name = "viewport"contment = "width = device-width, initial-scale = 1"> Platforwway> 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.css"rel = "외부 nofollow"rel = "스타일 시트">-> <script src = "https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"> </script> <script src = "https://cdn.bootcss.com/jquery-scrollto/2.1.2/jquery.scrollto.min.js"> </script> src = "https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"> </script> <!-[If Lt IE 9]> <Script src = "https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"> </script> <script> <script src = "https://cdn.bootcss.com/respond.js/1.4.2/resption.min.js"> <tyle> #Message {높이 : 600px; 오버플로 -Y : 자동; . aria-describedby = "basic-ws"placeholder = "게임"data-container = "body"data-placement = "top"data-content = "链接地址不能为空, 请填写"> </div> </div> <button "id ="btnconnect "onclick ="connect (); "> <버튼 ="버튼 "> </span> </span> </span> id = "btnclose"disabled = "disabled"onclick = "closewebsocket ();"> <span aria-hidden = "true"> </span> </button> <button type = "id ="id = "btnsend"disabled = "disabled"style = "margin-let : 50px;" onclick = "send ();"> <span aria-hidden = "true"> </span "> </span> </div> <br/> <textRea id ="inmsg "rows ="5 "placeholder ="在这里输入需要发送的信息 ... "> </textarea> <hr/> <div id ="메시지 "> </div> <cript src = "https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"> </script> <script> <script> <text/javascript "> 함수 zip (str) {var binarystring = pako.gzip (str, {to : 'string'}); 반환 BTOA (BinaryString); } 함수 unzip (b64data) {var strdata = atob (b64data); var chardata = strdata.split ( ''). map (function (x) {return x.charcodeat (0);}); var bindata = 새로운 uint8array (chardata); var data = pako.inflate (bindata); strdata = string.fromcharcode.apply (null, new UINT16ARRAY (data)); Return strdata; } var webSocket = null; var wsbaseurl = null; var wsurl = null; 함수 init () {wsbaseurl = "ws : //" + window.location.host + "/"; $ ( "#basic-ws"). 텍스트 (wsbaseurl); $ (function () {$ ( '[data-toggle = "popover"]'). popover ();}); 거짓을 반환합니다. } // websocket 连接 함수 closewebsocket () {if (websocket) {websocket.close (); } false를 반환합니다. } // 将消息显示在网页上 함수 setMessageInnerHtml (WHO, msg) {var message = null; if (who === 1) {message = '<div role = "alert"> 本地 :' + msg + '</div>'; } else {message = '<div role = "alert"> 服务器 :' + msg + '</div>'; } document.getElementById ( 'message'). innerHtml = (document.getElementById ( 'message'). innerHtml + 메시지); $ ( "#message"). scrollto ( '100%'); 거짓을 반환합니다. } // 发送消息 함수 send () {if (webSocket) {var message = $ ( "#inmsg"). val (); WebSocket.Send (Zip (메시지)); setMessageInnerhtml (1, 메시지); } false를 반환합니다. } function connect () {var url = $ ( "#basic-ws-addr"). val (); if (url.length <= 0) {$ ( '##basicws-addr'). popover ( 'show'); settimeout (function () {$ ( '##basic-ws-addr'). popover ( 'hide');}, 3000); } else {wsurl = wsbaseurl + url; if ( 'Window의'WebSocket ') {WebSocket = new WebSocket (wsurl); // websocket.onerror = function () {setMessageInnerhtml (0, "websocket 连接发生错误->" + wsurl); $ ( "#btnconnect"). removeAttr ( "disabled"); $ ( "#btnclose"). attr ( "disabled", "disabled"); $ ( "#btnsend"). attr ( "disabled", "disabled"); }; // websocket.onopen = function () {setMessageInnerhtml (0, "websocket 连接成功->" + wsurl); $ ( "#btnconnect"). attr ( "disabled", "disabled"); $ ( "#btnclose"). removeAttr ( "disabled"); $ ( "#btnsend"). removeattr ( "disabled"); }; // websocket.onmessage = function (event) {setMessageInnerhtml (0, unzip (event.data)); }; // websocket.onclose = function () {setMessageInnerhtml (0, websocket 连接关闭-> " + wsurl); $ ( "#btnconnect"). removeAttr ( "disabled"); $ ( "#btnclose"). attr ( "disabled", "disabled"); $ ( "#btnsend"). attr ( "disabled", "disabled"); }; // 监听窗口关闭事件 监听窗口关闭事件, 监听窗口关闭事件, 主动去关闭 webSocket 连接 连接, 防止连接还没断开就关闭窗口, Server 端会抛异常。 window.onbeforeUnload = function () {CoseWebSocket (); }; } else {alert ( 'support webSocket'); }} 거짓을 반환합니다. } window.onload = init (); </script> </body> </html>到此就可以使用 WebSocket 进行前后端的通信了 进行前后端的通信了, 如果大家还有不明白的或者有更好的方法, 可以在下方的留言区讨论。