亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java中Spring WebSocket詳解

2024-07-13 10:15:05
字體:
來源:轉載
供稿:網友

首先 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</artifactId></dependency><dependency>	<groupId>javax.websocket</groupId>	<artifactId>javax.websocket-api</artifactId>	<version>1.0</version>	<scope>provided</scope></dependency><dependency>	<groupId>org.springframework</groupId>	<artifactId>spring-websocket</artifactId></dependency><dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-web</artifactId>	<exclusions>		<exclusion>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-tomcat</artifactId>		</exclusion>	</exclusions></dependency><dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-undertow</artifactId></dependency>

接收消息后的處理類 GameHandler :

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.web.socket.TextMessage;import 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 message) throws Exception {  session.sendMessage(new TextMessage(message.asBytes())); } /**  * 處理二進制類的信息  *  * @param session  * @param message  * @throws Exception  */ @Override protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {  session.sendMessage(new BinaryMessage(message.getPayload())); } /**  * ping-pong  *  * @param session  * @param message  * @throws Exception  */ @Override protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {	 } /**  * 傳出錯誤的處理  *  * @param session  * @param exception  * @throws Exception  */ @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { } /**  * 連接關閉的處理  *  * @param session  * @param status  * @throws Exception  */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { } /**  * 連接建立后的處理  *  * @param session  * @throws Exception  */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception {	 }}

 握手信息攔截器 WebSocketHandshakeInterceptor :

import java.util.Map;import javax.servlet.http.Cookie;import org.springframework.http.server.ServerHttpRequest;import org.springframework.http.server.ServerHttpResponse;import 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 beforeHandshake(ServerHttpRequest request, ServerHttpResponse shr1, WebSocketHandler wsh, Map<String, Object> attributes) throws Exception {  // 此處可以做一些權限認證的事情或者其他  return true; } @Override public void afterHandshake(ServerHttpRequest shr, ServerHttpResponse shr1, WebSocketHandler wsh, Exception 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.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 extends WebMvcConfigurerAdapter implements WebSocketConfigurer {@Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {  // 允許連接的域,只能以http或https開頭  String[] allowsOrigins = {"http://127.0.0.1:1213", "http://localhost:1213"};  registry.addHandler(gameHandler(),"/game").addInterceptors(handshakeInterceptor()).setAllowedOrigins(allowsOrigins); } @Bean public GameHandler gameHandler() {  return new GameHandler(); } @Bean public WebSocketHandshakeInterceptor handshakeInterceptor() {  return new WebSocketHandshakeInterceptor(); }}

啟動類 Launcher :

@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-equiv="X-UA-Compatible" content="IE=edge">  <meta name="viewport" content="width=device-width, initial-scale=1">  <title>Platform Gateway</title>  <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet">  <!--<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" rel="external nofollow" rel="stylesheet">-->  <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>  <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 src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>  <![endif]-->  <style>   #message{    height: 600px;    overflow-y:auto;   }  </style> </head> <body>  <div class="container">   <h1>WebSocket Test Page</h1>   <hr/>   <div class="form-inline">    <div class="form-group">     <label for="wsAddr">WebSocket Address: </label>     <div class="input-group">      <span class="input-group-addon" id="basic-ws">ws://127.0.0.1:1213/</span>      <input type="text" class="form-control" id="basic-ws-addr" aria-describedby="basic-ws" placeholder="game" data-container="body" data-placement="top" data-content="鏈接地址不能為空,請填寫">     </div>    </div>    <button type="button" id="btnConnect" class="btn btn-primary" onclick="connect();">     <span class="glyphicon glyphicon-resize-small" aria-hidden="true"></span>     連接    </button>    <button type="button" id="btnClose" class="btn btn-danger" disabled="disabled" onclick="closeWebSocket();">     <span class="glyphicon glyphicon-remove" aria-hidden="true"></span>     斷開    </button>    <button type="button" id="btnSend" class="btn btn-info" disabled="disabled" style="margin-left: 50px;" onclick="send();">     <span class="glyphicon glyphicon-transfer" aria-hidden="true"></span>     發送消息    </button>   </div><br/>   <textarea class="form-control" id="inMsg" rows="5" placeholder="在這里輸入需要發送的信息..."></textarea>   <hr/>   <div id="message"></div>  </div>  <script 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'});      return btoa(binaryString);     }     function 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));      return strData;     }     var websocket = null;     var wsBaseUrl = null;     var wsUrl = null;     function init() {      wsBaseUrl = "ws://" + window.location.host + "/";      $("#basic-ws").text(wsBaseUrl);      $(function () {       $('[data-toggle="popover"]').popover();      });      return false;     }//關閉WebSocket連接     function closeWebSocket() {      if (websocket) {       websocket.close();      }      return false;     }//將消息顯示在網頁上     function setMessageInnerHTML(who, msg) {      var message = null;      if (who === 1) {       message = '<div class="alert alert-success" role="alert">本地: ' + msg + '</div>';      } else {       message = '<div class="alert alert-info" role="alert">服務器: ' + msg + '</div>';      }      document.getElementById('message').innerHTML = (document.getElementById('message').innerHTML + message);      $("#message").scrollTo('100%');      return false;     }//發送消息     function send() {      if (websocket) {       var message = $("#inMsg").val();       websocket.send(zip(message));       setMessageInnerHTML(1, message);      }      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' in window) {        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 () {         closeWebSocket();        };       } else {        alert('Not support websocket');       }      }      return false;     }     window.onload = init();  </script> </body></html>

到此就可以使用 WebSocket 進行前后端的通信了,如果大家還有不明白的或者有更好的方法,可以在下方的留言區討論。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品福利视频| 亚洲午夜未删减在线观看| 国产精品视频区1| 九九久久精品一区| 国产精品久久久久久五月尺| 国产一区二区av| 精品夜色国产国偷在线| 久久久久久久一区二区三区| 国产专区欧美专区| 亚洲自拍另类欧美丝袜| 日韩a**中文字幕| 成人黄色av免费在线观看| 中文字幕国产精品久久| 大胆欧美人体视频| 国产精品99免视看9| 亚洲白虎美女被爆操| 久久久精品亚洲| 亚洲一区二区福利| 亚洲激情小视频| 久久久久久97| 欧美福利视频在线| 亚洲国产精品专区久久| 国内偷自视频区视频综合| 欧美大人香蕉在线| 亚洲精品国产精品自产a区红杏吧| 欧美不卡视频一区发布| 亚洲女人天堂色在线7777| 日韩av在线最新| 亚洲欧美国内爽妇网| 亚洲精品美女在线| 精品久久久久久| 国产精选久久久久久| 在线观看国产成人av片| 亚洲美女激情视频| 4438全国亚洲精品在线观看视频| 国产亚洲一区精品| 欧美高清一级大片| 亚洲第一区第一页| 国产精品video| 黑人巨大精品欧美一区免费视频| 欧美精品在线视频观看| 91在线精品视频| 久久影院资源站| 欧美日韩在线观看视频| 中文字幕日韩专区| 欧美激情xxxx性bbbb| 不卡毛片在线看| 色综合久久88色综合天天看泰| 国产狼人综合免费视频| 伊人久久男人天堂| 欧美黑人xxx| 国产自产女人91一区在线观看| 中文字幕国产精品久久| 欧洲一区二区视频| 日韩最新av在线| 欧美日韩精品在线观看| 欧亚精品中文字幕| 日韩在线中文字| 亚洲美女福利视频网站| 国产91精品久久久久久| 国产欧美日韩精品在线观看| 欧美性黄网官网| 精品毛片三在线观看| 高清欧美电影在线| 久久露脸国产精品| 88国产精品欧美一区二区三区| 日韩成人性视频| 国产欧美日韩中文| 国产精品九九九| 欧美国产日韩一区二区三区| 国产成人福利视频| 亚洲码在线观看| 久久久久久久久久久免费精品| 国产69精品久久久久久| 国产精品久久一区主播| 亚洲精品小视频在线观看| 欧美大全免费观看电视剧大泉洋| 欧美视频第一页| 亚洲国产中文字幕久久网| 国产一区二区三区视频在线观看| 亚洲电影成人av99爱色| 欧美激情18p| 成人欧美一区二区三区黑人| 69久久夜色精品国产69乱青草| 久久久精品日本| 久久夜色精品亚洲噜噜国产mv| 精品精品国产国产自在线| 欧美精品一区二区三区国产精品| 久久精品国产精品亚洲| 欧美激情一区二区三区高清视频| 超碰97人人做人人爱少妇| 日本视频久久久| 上原亚衣av一区二区三区| 欧美成aaa人片免费看| 国产福利精品av综合导导航| 91精品国产综合久久男男| 日韩av不卡在线| 国产一区在线播放| 欧美久久精品一级黑人c片| 欧美黑人一区二区三区| 欧美最顶级的aⅴ艳星| 成人黄色免费看| 日韩精品中文字幕在线观看| 国产一区二区三区四区福利| 欧美日韩一区免费| 黄色成人在线播放| 亚洲视频一区二区| 色香阁99久久精品久久久| 91在线免费观看网站| 在线播放日韩精品| 色综合五月天导航| 成人福利免费观看| 日韩av电影在线免费播放| 国产精品久久久久91| 91系列在线播放| 精品香蕉在线观看视频一| 欧美成人激情视频免费观看| 亚洲风情亚aⅴ在线发布| 亚洲一区二区久久久| 成人久久18免费网站图片| 亚洲欧洲国产一区| 成人中文字幕+乱码+中文字幕| 亚洲女成人图区| 91九色单男在线观看| 国产91精品黑色丝袜高跟鞋| 亚洲精品免费在线视频| 国产精品香蕉av| 久久欧美在线电影| 77777亚洲午夜久久多人| 91国语精品自产拍在线观看性色| 日韩精品中文在线观看| 国产欧美一区二区| 欧美人成在线视频| 国产精品高潮呻吟久久av黑人| 8x海外华人永久免费日韩内陆视频| 久久久久久久久综合| 久久青草精品视频免费观看| 国产视频精品自拍| 日本精品久久久久影院| 亚洲伊人久久综合| 精品中文字幕在线观看| 最近中文字幕2019免费| 成人做爰www免费看视频网站| 91久久夜色精品国产网站| 国内精品久久久久| 久久成人精品视频| 视频在线观看一区二区| 欧美性极品xxxx娇小| 亚洲精品电影久久久| 国产日韩换脸av一区在线观看| 久久精彩免费视频| 日韩经典第一页| 中文字幕一区电影| 国产精品99蜜臀久久不卡二区| 中文字幕日韩综合av| 国产精品美女久久久久av超清| 欧美激情a∨在线视频播放| 亚洲丁香婷深爱综合| 久久综合亚洲社区| 性日韩欧美在线视频| 亚洲视频在线看| 国产91在线播放九色快色| 欧美极品少妇xxxxⅹ免费视频| 一区二区三区在线播放欧美|