首先 Pom.xml
<parent> <groupid> org.springframework.boot </GroupId> <ArtifactId> Spring-Boot-Starter-parent </artifactid> <sersive> 1.5.8.Release </version> </parent> <Dependency> <groupd> org.apache.commons </Groupid> <ratifactid> commons-io </a rtifactId> </degulency> <Dependency> <groupId> javax.websocket </GroupId> <strifactid> javax.websocket-api </artifactid> <sersion> 1.0 </version> <crappope> предоставлен </scope> </dependency> <Depeication> <groupid> org.sprameFramework </rack> </depelice> <dehyed> <groupid> org.spramework </scope> </dependency> <Depeication> <groupid> org.spramework </racpe> Id> <artifactid> Spring-websocket </artifactid> </dependency> <dependency> <groupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web GroupID> <ArtifactId> Spring-Boot-Starter-tomcat </artifactid> </exclusion> </exclusions> </degy Deploy> <deperial> <groupid> org.springframework.boot </GroupId> <ratifactid> Spring-boot-starter-undertow </artifactid> </зависимость>
接收消息后的处理类 Gamehandler:
Импорт java.net.uri; импорт org.springframework.web.socket.binarymessage; импорт org.springframework.web.socket.closestatus; импорт org.springframework.web.socket.pongmessage; импорт org.spramework.web.socket.extmesse; org.springframework.web.socket.websocketsession; import org.springframework.web.socket.handler.abstractwebsockethandler; открытый класс Gamehandler Extainds AbstractWebockethandler { / ** * 处理字符串类的信息 * @param Session * @param * @Throws Excect * @@override voideSteSteSteSteSteSgeSgeSage. Сообщение) Throws Exception {session.sendmessage (new TextMessage (message.asbytes ())); } / ** * 处理二进制类的信息 * * @param session * @param Сообщение * @Throws Exception * / @Override Protected void handlebinaryMessage (сеанс WebSocketSession, BinaryMessage Message) Throws Exception {session.sendmessage (new BinaryMessage (message.getPayload ())); } / ** * Ping-pong * * @param session * @param Сообщение * @Throws Exception * / @@Override Protected void handlepongmessage (сеанс веб-сайта, сообщение pongmessage). } / ** * 连接关闭的处理 * * @param Session * @param Status * @Throws Exception * / @Override public void -conconnectionCloseClose (WebSocketSession Session, CloseStatus) Throws Exception {} / ** * 连接建立后的处理 * * @param Session * @Throhs Excection * / @Override public voideSectableSeStableDestableDised (WebsocketSessionSession).握手信息拦截器 Websockethandshakeinterceptor:
Импорт java.util.map; import javax.servlet.http.cookie; import org.springframework.http.server.serverhttprequest; import org.springframework.http.server.serverhttpresson org.springframework.http.server.servletserverhttprequest; import org.springframework.web.socket.websockethandler; импорт org.springframework.web.socket.server.handshakeintertor; Запрос заранее (Serverhttprequest, Serverhttpresponse shr1, websockethandler wsh, map <string, object> attributes) бросает исключение {// 此处可以做一些权限认证的事情或者其他 return true; } @Override public void ufferhandshake (serverhttprequest shr, serverhttpresponse shr1, websockethandler wsh, exceptn excptn) {}}使用 WebSocket 的配置类 WebSocketConfig:
Import org.springframework.context.annotation.bean; Import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.webmvcconfigurerAdapter; import org.spramework.socketSockeSockeSocteptaity; org.springframework.web.socket.config.annotation.websocketConfigurer; import org.springframework.web.socket.config.annotation.websockethandlerregistr Registerwebsockethandlers (реестр WebSockethandlerregistry) {// 允许连接的域, 只能以 http 或 https 开头 string [] ulporigins = {"http://127.0.0.1:1213", "http: // localhost: 1213"}; Registry.addhandler (GameHandler (), "/game"). AddInterceptors (HandshakeInterceptor ()). SetAllowedorigins (AlserorIgins); } @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 (launcher.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-region = 1024server.undertow.direct-buffers = true
前端的测试页面 Main/resources/static/index.html
<! Doctype html> <html lang = "zh-cn"> <head> <meta charset = "utf-8"> <meta http-eviv = "x-ua-complayable" content = "ie = edge"> <meta name = "viewport" content = "width = device-width, pirom href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel = "External nofollow" rel = "styleSheet"> <!- href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" rel = "внешний nofollow" rel = "stylesshie">-> <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.min. src = "https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"> </script> <!-[if Ie 9]> <Скрипт src = "https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"> </script> <script src = "https://cdn.bootcss.com/respl.js/1.4.2/resp.min.min.min.min.js> </endifp.comm/resp. <style> #message {height: 600px; Overflow-y: Auto; } </style> </head> <body> <div> <h1> Страница тестирования WebSocket </h1> <hr/> <div> <div> <label for = "wsAddr"> адрес websocket: </label> <div> <pran id = "basic-ws"> ws: //127.0.0.1: 1213/</span> <input ytept = "yte yex =" yed "=" yed "=" vas "" vas = "vas" "vas =" vas extdddr "=". 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 = "closewebsocket ();"> <span aria-hidden = "true"> </span> 断开 </button> <button type = "button" id = "btnsend" disablet = "disablet" style = "margin-left: 50px;" onclick = "send ();"> <span aria-hidden = "true"> </span> 发送消息 </button> </div> <br/> <textarea id = "inmsg" rows = "5" Placeholder = "在这里输入需要发送的信息 ..."> </textarea> <hr/> <div id = " src = "https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"> </script> <script type = "text/javascript"> function Zip (str) {var binarystring = pako.gzip (str, {to: 'string'}); вернуть 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)); вернуть стрдаты; } var websocket = null; var wsbaseurl = null; var wsurl = null; function init () {wsbaseurl = "ws: //" + window.location.host + "/"; $ ("#basic-ws"). Текст (wsbaseurl); $ (function () {$ ('[data-toggle = "popover"]'). popover ();}); вернуть ложь; } // 关闭 websocket 连接 function closewebsocket () {if (websocket) {websocket.close (); } вернуть false; } // 将消息显示在网页上 Функция setMessAgeInnerHtml (WHO, msg) {var message = null; if (who === 1) {message = '<div rol = "alert"> 本地:' + msg + '</div>'; } else {message = '<div rol = "alert"> 服务器:' + msg + '</div>'; } document.getElementById ('message'). innerHtml = (document.getElementById ('message'). innerHtml + message); $ ("#Message"). Scrollto ('100%'); вернуть ложь; } // 发送消息 function 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) {$ ('#basic-ws-addr'). popover ('show'); setTimeout (function () {$ ('#basic-ws-addr'). popover ('hide');}, 3000); } else {wsurl = wsbaseurl + url; if ('websocket' в Window) {websocket = new WebSocket (wsurl); // 连接发生错误的回调方法 websocket.onerror = function () {setmessageinnerhtml (0, "websocket 连接发生错误 ->" + wsurl); $ ("#btnconnect"). removeAttr ("отключен"); $ ("#btnclose"). attr ("отключен", "отключен"); $ ("#btnsend"). attr ("отключен", "отключен"); }; // 连接成功建立的回调方法 websocket.onopen = function () {setmessageinnerhtml (0, "websocket 连接成功 ->" + wsurl); $ ("#btnconnect"). attr ("отключен", "отключен"); $ ("#btnclose"). removeAttr ("отключен"); $ ("#btnsend"). removeAttr ("отключен"); }; // 接收到消息的回调方法 websocket.onmessage = function (event) {setmessageinnerhtml (0, unzip (event.data)); }; // 连接关闭的回调方法 websocket.onclose = function () {setmessageinnerhtml (0, "websocket 连接关闭 ->" + wsurl); $ ("#btnconnect"). removeAttr ("отключен"); $ ("#btnclose"). attr ("отключен", "отключен"); $ ("#btnsend"). attr ("отключен", "отключен"); }; // 监听窗口关闭事件 , 当窗口关闭时 , 主动去关闭 websocket 连接 , 防止连接还没断开就关闭窗口 , Сервер 端会抛异常。 window.onbeforeUnload = function () {closeWebSocket (); }; } else {alert ('не поддерживает WebSocket'); }} вернуть false; } window.onload = init (); </script> </body> </html>到此就可以使用 WebSocket 进行前后端的通信了 如果大家还有不明白的或者有更好的方法 , 可以在下方的留言区讨论。 可以在下方的留言区讨论。