首先 pom.xml
<partent> <groupid> org.springframework.boot </groupid> <ArTifactId> Spring-boot-starter-parent </artifactid> <version> 1.5.8.release </version> </parent> <dependency> <groupid> org.apache.commons </groupid> <ArtuFacTid> Commons-commons-commons-org.apache.commons </groupid> <Artivactid> Commons-commons-commons-commons rtifactId> </dependency> <dependency> <groupId> javax.websocket </proupId> <ArtifactId> javax.websocket-api </stifactid> <version> 1.0 </version> <scope> disediakan </scope> </dependency> <dependency> <groupid> <groupid> ID> <ArTifactId> Spring-Websocket </artifactid> </gandendency> <dependency> <Groupid> org.springframework.boot </proupid> <RaintifactId> <crupt-boots-starter-web </artifactid> <scuxlusions> <scualsect> <groupid> GroupId> <RaintifactId> Spring-boot-starter-tomcat </t ArtifactId> </cexclusion> </cexclusions> </dependency> <dependency> <Groupid> org.springframework.boot </groupid> <ArtifactId> Spring-boots-starter-undertow </artifactid> <t Artifactid>
接收消息后的处理类 GameHandler:
impor java.net.uri; impor org.springframework.web.socket.binarymessage; impor org.springframework.web.socket.closestatus; impor org.spramework.web.socket.pongMessage; impor org.spramework.web.socket.pongMessage; impor org.spramework.web.web org.springframework.web.socket.websocketsession; impor org.springframework.web.socket.handler.Abstractwebsockethandler; Kelas Publik GameHandler memperluas abstractwebsockethandler { / ** * 处理字符串类的信息 * @param sesi * @param pesan * @throwsexion @throwsmion ** @@throwsmion ** @phowexes * Pesan TextMessage) melempar Exception {session.sendMessage (TextMessage baru (message.asbytes ())); } / ** * 处理二进制类的信息 * * @param session * @param pesan * @throws Exception * / @Override Protected void qualdermessage (Sesi WebSocketsession, BinaryMessage Pesan) melempar Exception {session.SendMessage (BinerMessage baru (message.getPayLoad ())); } / ** * ping-pong * * @param sesi * @param pesan * @throws Exception * / @Override Dilindungi void handpongMessage (WebSocketsession Sesi, PongMessage Pesan) Melempar Exception {} / ** * @ * @param Sesi * @param Exception * @Throws Exception * @Override Publicon (Publicpporr Exception * @Throws Exception * @ @ @ @ @Override ( @ @ @Override ( @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@throws @throws * Lempar Pengecualian {} / ** * 连接关闭的处理 * * @param sesi * @param Status * @throws Exception * / @Override public void afterconnectionclosed (sesi WebSocketsession, status terdekat) Lemparan Exception {} {ever -ever - @ @ @ @ @ @ @ @ @ @evelrows @explowse { @ @evelrows { @evelrows { @evelrows { @evelrows {eVelride public握手信息拦截器 WebsockethandshakeInterceptor:
Impor java.util.map; impor javax.servlet.http.cookie; impor org.springframework.http.server.serverHttpRequest; impor org.springframework.http.server.serverHtprespresse; impor; org.springframework.http.server.serverServerHttpRequest; impor org.springframework.web.socket.websockethandler; impor org.springframework.web.socket.server.handshakeKeptor; Webseptor PublicRakePorDorePorePorePor.server. Sebelum Handshake (Permintaan ServerHttPRequest, ServerHttPresponse Shr1, Websockethandler WSH, peta <String, Object> Atribut) melempar Exception {// 此处可以做一些权限认证的事情或者其他 Return true; } @Override public void afterhandshake (serverHttpRequest shr, serverHttpresponse shr1, Websockethandler WSH, pengecualian excptn) {}}使用 WebSocket 的配置类 WebSocketConfig:
impor org.springframework.context.annotation.bean; impor org.springframework.context.annotation.onfigurasi; impor org.springframework.web.servlet.config.annotation.webmvcconfigurerAdapter; impor 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 memperluas WebMvCconfigurerAdapter mengimplementasikan WebSocketConfigurer {@Override public void registerwebsockethandlers (WebSockethandlerregistry Registry) {// 允许连接的域, 只能以 http 或 https 开头 string [] {"http:12 "http: // localhost: 1213"}; Registry.addhandler (GameHandler (), "/Game"). AddInterceptors (HandshakeInterceptor ()). SetAllowEdorigins (memungkinkan Saudari); } @Bean Public GameHandler GameHandler () {return new GameHandler (); } @Bean WebsockethethandshakeInterceptor HandshakeInterceptor () {return New WebSockethandShakeInterceptor (); }}启动类 Peluncur:
@SpringbootApplicationPublic class class {public static void main (string [] params) {springApplication.run (peluncur.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
前端的测试页面 Utama/Sumber Daya/Statis/Indeks.html
<! Doctype html> <html lang = "zh-cn"> <head> <meta charset = "utf-8"> <meta http-equiv = "x-ua-kompatibel" konten = "IE = edge"> <meta name = "viewport" content = "width = device-width, initial-scale = 1 href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel = "eksternal nofollow" rel = "stylesheet"> <!-<tautan href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" rel = "eksternal nofollow" rel = "stylesheet">-> <skrip 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 src = "https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"> </script> <!-[jika lt yaitu 9]> <skrip src = "https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"> </script> <script src = "https://cdn.bootcss.com/respespespespeses.js/1.4.2/cdn.bootcss.com/respespespespespestions.js/1.4.2/cpespess #message {height: 600px; overflow-y: otomatis; } </tyle> </head> <body> <div> <h1> Halaman uji WebSocket </h1> <hr/> <div> <verv> <label untuk = "WSADDR"> Alamat Websocket: </label> <v> <span id = "BASIC-WS"> WS: //127.0.0.1: 1213/</span-ws "> WS: //1277.0.0.1: 1213/</span-ws"> WS: //127.0.0.1: 1213/</Spans = SPANE "> WS: //127.0.0.1: 1213/</Spans = SPANE"> WS: //127.0.0.1: 1213/</Spans = SPANE "> WS: //127.0.0.1: 1213/</Spans = SPANE"> WS: //127 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" dinonaktifkan = "dinonaktifkan" ontClick = "closeWebsocket ();"> <span aria-hidden = "true"> </span> 断开 </button> <tombol type = "tombol" id = "btnsend" dinonaktifkan = "dinonaktifkan" style = "margin-left: 50px;" OnClick = "Send ();"> <span aria-hidden = "true"> </span> 发送消息 </button> </div> <br/> <textarea id = "inmsg" baris = "5" placeholder = "在这里输入需要发送的信息 ..."> </textarea> <jam/> <div id = "pesan"> </div> </Div> src = "https://cdn.bootcss.com/boottrap/3.3.7/js/boottrap.min.js"> </script> <script type = "text/javascript"> function zip (str) {var binerstring = pako.gzip (str, {to: 'string) return btoa (BinerString); } function unzip (b64data) {var strdata = atob (b64data); var chardata = strdata.split (''). map (function (x) {return x.charCodeat (0);}); var bindata = uint8Array baru (chardata); var data = pako.inflate (bindata); strdata = string.fromCharCode.Apply (null, uint16Array baru (data)); mengembalikan strdata; } var WebSocket = null; var wsbaseUrl = null; var wsurl = null; fungsi init () {wsbaseUrl = "ws: //" + window.location.host + "/"; $ ("#BASIC-WS"). Teks (WSBaseUrl); $ (function () {$ ('[data-koggle = "popover"]'). Popover ();}); mengembalikan false; } // 关闭 WebSocket 连接 Fungsi closeWebsocket () {if (WebSocket) {WebSocket.Close (); } return false; } // 将消息显示在网页上 Fungsi setMessageInnerHtml (who, msg) {var message = null; if (who === 1) {message = '<div role = "alert"> 本地:' + msg + '</div>'; } else {message = '<div role = "waspada"> 服务器:' + msg + '</div>'; } document.getElementById ('pesan'). innerHtml = (document.geteLementById ('pesan'). InnerHtml + pesan); $ ("#pesan"). Scrollto ('100%'); mengembalikan false; } // 发送消息 function send () {if (WebSocket) {var message = $ ("#inmsg"). Val (); websocket.send (zip (pesan)); setMessageInnerHtml (1, pesan); } return 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' di jendela) {WebSocket = WebSocket baru (WSURL); // 连接发生错误的回调方法 WebSocket.onError = function () {setMessageInnerHtml (0, "WebSocket 连接发生错误 ->" + wsurl); $ ("#btnconnect"). RemoveAttr ("Disabled"); $ ("#btnclose"). attr ("dinonaktifkan", "dinonaktifkan"); $ ("#btnsend"). attr ("dinonaktifkan", "dinonaktifkan"); }; // 连接成功建立的回调方法 websocket.onopen = function () {setMessageInnerHtml (0, "WebSocket 连接成功 ->" + wsurl); $ ("#btnconnect"). attr ("dinonaktifkan", "dinonaktifkan"); $ ("#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 ("dinonaktifkan", "dinonaktifkan"); $ ("#btnsend"). attr ("dinonaktifkan", "dinonaktifkan"); }; // 监听窗口关闭事件 , 当窗口关闭时 , 主动去关闭 WebSocket 连接 , 防止连接还没断开就关闭窗口 , server 端会抛异常。 window.onbeforeunload = function () {closeWebsocket (); }; } else {alert ('Not Mendukung WebSocket'); }} return false; } window.onload = init (); </script> </body> </html>到此就可以使用 Websocket 进行前后端的通信了 , 如果大家还有不明白的或者有更好的方法 , ,