首先 pom.xml
<Dor> <roupid> org.springframework.boot </frugiD> <ArtifactId> Spring-boot-Starter-Parent </ArtifactId> <Versão> 1.5.8.release </sipers> </parentfactid> <pusency> <voundid> org.apache.CommOns </Groupid> <TRAFACTID> rtifactId> </dependency> <pendency> <puperid> javax.websocket </foupid> <TRATIFACTID> javax.websocket-api </artifactId> <versão 1.0 </version> <cope> fornecido </scope> </dependency> <pendency> <puperId> oug.springfringfringfring Id><artifactId>spring-websocket</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</ groupid> <TarifactId> primavera-boot-starter-tomcat </sutifactId> </clusion> </clusions> </dependency> <pendecency> <puperid> org.springframework.boot </groupid> <stifactid> spring-boot-starter-undertow </strofactid> </dependência>
接收消息后的处理类 GameHandler:
importar java.net.uri; importar org.springframework.web.socket.binarymessage; importar org.springframework.web.socket.closestatus; importação org.springframework.web.socket.ponocksage; importemxt.springframework.web.sockettesage; 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 sessão, mensagem textMessage) lança a Exceção {session.sendMessage (new textMessage (message.asbytes ())); } / ** * 处理二进制类的信息 * * @param session * @param mensagem * @throws Exception * / @Override Protected void handleBinaryMessage (sessão WebSocketSession, BinaryMessage Message) lança exceção {session.sendMessage (new BinaryMessage (message.getPayload ()); } / ** * ping-pong * * @param session * @param mensagem * @throws Exception * / @Override Protected void handlePongMessage (sessão websocketSession, PongMessage Mensagem) lança exceção ( @} / ** ** ** 传出错误的处理 * * @param session * @param excepção * @throws ( @@Override Void Vor. } / ** * 连接关闭的处理 * * @param session * @param status * @throws Exceção * / @Override public void AfterConnectionClosed (sessão WebSocketSession, status próximo) lança Exceção {} / ** * 连接建立后的处理 * * * @param sessão * @THOWSEXCECTION / @Override Void public APENCENCIO握手信息拦截器 WebsocketHandShakeInterceptor:
importar java.util.map; importar javax.servlet.http.cookie; importar org.springframework.http.server.serverhttprequest; importar org.springframework.http.server.serverhtpropSonse; org.springframework.http.server.servleTServerhttprequest; importar org.springframework.web.socket.websockethandler; importestring.springframework.web.socket.server.HandshakeInteptInterInterInterInterndRendShandshing.web.socket.server.HandsHorPORTInterInterInterndRorThRing. Antes da solicitação de servidor (servidorhttPrequest, serverhttproponse shr1, websockethandler wsh, map <string, objeto> atributos) lança a exceção {// 此处可以做一些权限认证的事情或者其他 retorna true; } @Override public void AfterHandshake (serverhttprequest shr, serverhttproponse shr1, websockethandler wsh, exceção excptn) {}}使用 WebSocket 的配置类 WebSocketConfig:
importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration; importar org.springframework.web.servlet.config.annotation.webmvcconfigureRadapter; importar; org.springframework.web.socket.config.annotation.enablewebsocket; importar org.springframework.web.socket.config.annotation.websocketconfigurer; importbrated.springframework.web.socket.conofaturys; O WebSocketConfig estende o WebMVCConfigureRAdApter implementa WebSocketConfigurer {@Override public void RegisterWebsocketHandlers (WebSocketHandlerRegistry Registry) {// 允许连接的域, 只能以 http 或 https 开头 string [] permite 开头. "http: // localhost: 1213"}; Registry.addhandler (GameHandler (), "/Game"). AddInterceptores (HandshakeIntercept ()). Setallowedorigins (Permisorigins); } @Bean public gamehandler gamehandler () {return new gamehandler (); } @Bean public websockethandshakeInterceptor handshakeIntercept () {retorna novos websockethandshakeIntercept (); }}启动类 Launcher:
@Springbootapplicationpublic Classe iniciador {public static void main (string [] params) {springapplication.run (lançador.class, params);}}配置文件 Main/Recursos/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.underver.dirw.dirtw.buffers-per-cer =
前端的测试页面 Main/Recursos/estático/index.html
<! Doctype html> <html lang = "zh-cn"> <head> <meta charset = "utf-8"> <meta http-equiv = "x-ua-compatible" content = "ie = Edge"> <meta name "título" = "width = device-width,, inicialmente, 1 scale"> scale "> <meta =" viewport "=" width = device-width,,, 1 scale "> scale"> <meta = "viewport" = "width = device-width,,, 1, 1 portão <weate> scale) <eeway> scale) 1 e" title/"title/" width = device-width = "ie = scale"> <meta = "viewport" = "width = device-width,, href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel = "Nofollow externo" rel = "Stylesheet"> <!-<link href = "https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" rel = "Nofollow externo" rel = "Stylesheet">-> <Script src = "https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"> </script> <script src = "https://cdn.bootcss.com/jqueryery-scrollto/2.1.2/jquery.scrollo.mclto.mcom/jqueryery"> src = "https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.6/pako.min.js"> </script> <!-[se lt ie 9]> < 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]--> <estilo> #message {altura: 600px; transbordamento-y: automático; } </style> </ad Head> <body> <div> <h1> Página de teste websocket </h1> <hr/> <div> <div> <gravador para = "wsaddr"> endereço websocket: </label> <div> <span iD = "Basic-ws"> ws: //127.0.0.1: 1213/splan </splan> ARIA-DESCRIBEDBY = "BASIC-WS" PLAGEHERTER = "GAME" Data-container = "Body" Data-posting = "Top" Data-content = "链接地址不能为空, 请填写"> </div> </div> <botão Tipo = "Button Button" Id = "Btnconnect" OnClick = "(); id = "btnclose" desativado = "desativado" onclick = "closewebsocket ();"> <span ARIA-HIDDENTE = "true"> </span> 断开 </button> <button type = "button" id = "btnsend" desabiled = "desabiled" style = "margin-left: 50px;"; OnClick = "send ();"> <span Aria-hidden = "true"> </span> 发送消息 </butut> </div> <br/> <texttarea id = "inmsg" lobos = "5" placeholder = "在这里输入需要发送的信息 ..."> </textarea> <hr/> <div id = "mensagem"> </div> src = "https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.minmin.js"> </script> <script type = "text/javascript"> function (string) {var Binarystring = pako.gzip (str, {para:: {para: {para:: 'string; retornar BTOA (BinaryString); } função unzip (b64data) {var strdata = atob (b64data); var chardata = strdata.split (''). map (function (x) {return x.charcodeat (0);}); var bindata = novo uint8Array (chardata); var dados = pako.inflate (bindata); strdata = string.fromcharcode.apply (null, novo uint16Array (dados)); retornar strdata; } var websocket = null; var wsbaseurl = null; var wsurl = nulo; function init () {wsbaseurl = "ws: //" + window.location.host + "/"; $ ("#BASIC-WS"). Texto (wsbaseurl); $ (function () {$ ('[data-toggle = "popover"]'). Popover ();}); retornar falso; } // 关闭 websocket 连接 function closewebSocket () {if (websocket) {websocket.close (); } retornar false; } // 将消息显示在网页上 função setMessageInnerHtml (OMS, 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 + mensagem); $ ("#message"). scrollto ('100%'); retornar falso; } // 发送消息 function send () {if (webSocket) {var message = $ ("#inmsg"). Val (); webSocket.send (zip (mensagem)); setMessageInnerHtml (1, mensagem); } retornar false; } function Connect () {var url = $ ("#BASIC-WS-ADDR"). Val (); if (url.length <= 0) {$ ('#básico-ws-addr'). Popover ('show'); setTimeout (function () {$ ('#BASIC-WS-ADDR'). Popover ('hide');}, 3000); } else {wsurl = wsbaseurl + url; if ('websocket' na janela) {websocket = new websocket (wsurl); // websocket.onerror = function () {setMessageInnerhtml (0, "websocket 连接发生错误 ->" + wsurl); $ ("#btnconnect"). removeattr ("desativado"); $ ("#btnclose"). Att ("desativado", "desativado"); $ ("#btnsend"). Att ("desativado", "desativado"); }; // websocket.onopen = function () {setMessageInnerHtml (0, "websocket 连接成功 ->" + wsurl); $ ("#btnconnect"). Att ("desativado", "desativado"); $ ("#btnclose"). removeattr ("desativado"); $ ("#btnsend"). removeattr ("desativado"); }; // websocket.onMessage = function (event) {setMessageInnerHtml (0, unzip (event.data)); }; // websocket.onclose = function () {setMessageInnerhtml (0, "websocket 连接关闭 ->" + wsurl); $ ("#btnconnect"). removeattr ("desativado"); $ ("#btnclose"). Att ("desativado", "desativado"); $ ("#btnsend"). Att ("desativado", "desativado"); }; // 监听窗口关闭事件 , 当窗口关闭时 , 主动去关闭 webSocket 连接 , 防止连接还没断开就关闭窗口 , servidor 端会抛异常。 window.OnBeforeUnLoad = function () {CloseWebSocket (); }; } else {alert ('não suporta webSocket'); }} retornar false; } window.onload = init (); </script> </body> </html>Websocket 进行前后端的通信了 , 如果大家还有不明白的或者有更好的方法 , 可以在下方的留言区讨论。 可以在下方的留言区讨论。