日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

教你怎么使用Java實現WebSocket

瀏覽:222日期:2022-08-13 10:51:44
一、WebSocket簡介

WebSocket協議通過在客戶端和服務端之間提供全雙工通信來進行Web和服務器的交互功能。

在WebSocket應用程序中,服務器發布WebSocket端點,客戶端使用url連接到服務器。建立連接后,服務器和客戶端就可以互相發送消息。客戶端通常連接到一臺服務器,服務器接受多個客戶端的連接。

1.1 WebSocket協議

WebSocket協議有兩個部分:握手和傳輸。客戶端通過向服務端URL發送握手請求來建立連接。握手與現有的基于HTTP的基礎結構相兼容。Web服務器將其解釋為升級版的HTTP連接請求。一個客戶端建立連接的握手請求:

GET /path/to/websocket/endpoint HTTP/1.1Host: localhostUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==Origin: http://localhostSec-WebSocket-Version: 13

一個服務端響應:

HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

從上面的請求和響應中可以看出來,一個WebSocket連接的建立,需要客戶端和服務端維護一個Key來作為該連接的連接憑證。客戶端向服務端發送WebSocketKey,服務器根據WebSocketKey生成WebSocketAccept返回給客戶端,客戶端對WebSocketKey的值再進行相同的操作,如果與服務器返回的Accept的值相匹配,就表示握手成功。握手之后客戶端與服務端就互相發送消息。

教你怎么使用Java實現WebSocket

1.2 WebSocket支持的消息類型

WebSocket支持文本消息(UTF-8編碼)和二進制消息。WebSocket的控制消息由Close、Ping、Pong組成。ping和pong也有可能包含應用程序信息。webSocket端點具有如下的URI形式表示:

ws://host:port/path?querywss://host:port/path?query

ws代表未加密的連接,默認端口是80wss代表加密的連接,默認端口是443path:表示服務器內端點的位置query:路徑參數信息

二、創建一個WebSocket程序

創建和部署WebSocket端點的過程如下:1、創建一個端點類2、實現端點的生命周期方法3、將業務邏輯添加到端點4、將端點部署到Web應用程序中

注意:與Servlet相反,WebSocket端點類會被實例化多次,容器針對與其部署的URI的每個連接都創建一個實例。每個實例都與一個連接相關聯。因為在任何時間都只有一個線程執行端點實例的代碼,所以有助于保持每個連接的用戶狀態簡化開發。

2.1 生命周期方法

EndPoint類中定義了三個生命周期方法:onOpen、onClose、onError使用注解方式創建服務類

@ServerEndpoint('/echo')public class EchoEndpoint { @OnMessage public void onMessage(Session session, String msg) { try { session.getBasicRemote().sendText(msg); } catch (IOException e) { ... } }}2.2 業務邏輯方法

@ServerEndpoint('/receive')public class ReceiveEndpoint { @OnMessage public void textMessage(Session session, String msg) { System.out.println('Text message: ' + msg); } @OnMessage public void binaryMessage(Session session, ByteBuffer msg) { System.out.println('Binary message: ' + msg.toString()); } @OnMessage public void pongMessage(Session session, PongMessage msg) { System.out.println('Pong message: ' + msg.getApplicationData().toString()); }}

注意:一個服務類最多可以有三個OnMessage注解,每個消息類型分別使用一種方法:Text、Binary、Pong

2.3 維護客戶狀態

有時在程序中我們可能需要在連接中維護一些用戶參數,WebSocket也提供了這樣的服務Session.getUserProperties獲取用戶參數信息如果要存儲所有連接的客戶端共有的信息,可以使用靜態變量,但是需要用戶保證對數據的線程安全訪問。

@ServerEndpoint('/delayedecho')public class DelayedEchoEndpoint { @OnOpen public void open(Session session) { session.getUserProperties().put('previousMsg', ' '); } @OnMessage public void message(Session session, String msg) { String prev = (String) session.getUserProperties() .get('previousMsg'); session.getUserProperties().put('previousMsg', msg); try { session.getBasicRemote().sendText(prev); } catch (IOException e) { ... } }}2.4 數據格式的編碼與解碼

由于客戶端和服務端交互可能涉及數據格式的轉換,所以提供了Decoder和Encoder的方式解決。同時由于WebSocket的@Message注解只能有一個用來傳輸Text信息或Binary信息,所以要進行最常用的Json->entity轉換解析就需要該方法Encoder

Encoder.Text 用于文本消息Encoder.Binary 用于二進制消息

使用方法:

1、創建編解碼類

public class MessageATextEncoder implements Encoder.Text<MessageA> { @Override public void init(EndpointConfig ec) { } @Override public void destroy() { } @Override public String encode(MessageA msgA) throws EncodeException { // Access msgA’s properties and convert to JSON text... return msgAJsonString; }}

2、在端點類注解中添加該Encoder

@ServerEndpoint( value = '/myendpoint', encoders = { MessageATextEncoder.class, MessageBTextEncoder.class })public class EncEndpoint { ... }

3、這時候就可以發送MessageA和MessageB兩種類型的Text數據

MessageA msgA = new MessageA(...);MessageB msgB = new MessageB(...);session.getBasicRemote.sendObject(msgA);session.getBasicRemote.sendObject(msgB);

注意:webSocket會自動尋找使用哪種編碼器,所以發送數據統一使用sendObject即可

Decoder

實現Decoder以將WebSocket消息轉換為Java對象

Decoder.Text 用于文本消息 Decoder.Binary 用于二進制消息

使用方法

與Encoder類似

注意:與Encoder不同,Decoder最多可以指定一個Binary和一個Text類型的Decoder,如果有兩種以上的Java類型作為文本消息進行發送和接收需要進行定義處理。可以使多個消息繼承一個公共的消息父類

1、編寫Decoder類,對收到消息類型的不同進行不同的解碼

public class MessageTextDecoder implements Decoder.Text<Message> { @Override public void init(EndpointConfig ec) { } @Override public void destroy() { } @Override public Message decode(String string) throws DecodeException { // Read message... if ( /* message is an A message */ ) return new MessageA(...); else if ( /* message is a B message */ ) return new MessageB(...); } @Override public boolean willDecode(String string) { // Determine if the message can be converted into either a // MessageA object or a MessageB object... return canDecode; }}

2、在端點類中添加decoders={MessageDecoder.class}

@ServerEndpoint( value = '/myendpoint', encoders = { MessageATextEncoder.class, MessageBTextEncoder.class }, decoders = { MessageTextDecoder.class })public class EncDecEndpoint { ... }

3、在@OnMessage方法中使用

@OnMessagepublic void message(Session session, Message msg) { if (msg instanceof MessageA) { // We received a MessageA object... } else if (msg instanceof MessageB) { // We received a MessageB object... }}

到此這篇關于教你怎么使用Java WebSocket的文章就介紹到這了,更多相關Java WebSocket詳解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品亚洲aⅴ在线影院| 午夜a一级毛片亚洲欧洲| 激情综合网站| 久久精品九色| 日本va欧美va瓶| 先锋亚洲精品| 欧美手机在线| 日韩欧美视频专区| 日本国产欧美| 亚洲精品少妇| 亚洲人成网77777色在线播放 | 丝袜美腿高跟呻吟高潮一区| 欧美成人a交片免费看| 国产精品xxx在线观看| 免费日韩视频| 亚洲精品一区三区三区在线观看| 日本一区二区高清不卡| 欧美激情aⅴ一区二区三区| 日本不卡在线视频| 日韩美女国产精品| 一区在线观看| 亚洲激情中文在线| 在线国产一区二区| 99香蕉国产精品偷在线观看| 一区久久精品| 另类av一区二区| 一区免费在线| 性欧美长视频| 亚洲影院天堂中文av色| 亚洲小说春色综合另类电影| 少妇精品久久久一区二区| 婷婷成人av| 国产精品亚洲综合久久| 国产精品s色| 美女精品一区二区| 国产精品igao视频网网址不卡日韩 | 激情久久久久久久| 亚洲激情不卡| 久久午夜影视| 日本久久一区| 久久av网址| 老牛影视精品| 亚洲高清影视| 国产亚洲一区在线| 婷婷精品在线| 国产精品丝袜在线播放| 国产伦精品一区二区三区在线播放| 久久国产精品免费精品3p| 国产欧美88| 国产在线一区不卡| 久久久精品网| 喷白浆一区二区| 青草久久视频| 精品欧美日韩精品| 久久久久久黄| 天堂av在线一区| 日本强好片久久久久久aaa| 国产日韩欧美| 精品视频高潮| 欧美一区二区三区高清视频| 亚洲专区欧美专区| 欧美精品福利| 久久精品中文| 亚洲人成亚洲精品| 国产精品白丝久久av网站| 精品捆绑调教一区二区三区| 免费日韩精品中文字幕视频在线| 欧美日韩91| 91精品韩国| 美日韩精品视频| 日韩久久一区| 成人精品亚洲| 日韩精品免费视频一区二区三区 | 肉色欧美久久久久久久免费看| 色婷婷狠狠五月综合天色拍| 国产农村妇女精品一区二区| 国产精品欧美日韩一区| 欧美日韩在线观看首页| 日韩一级精品| 国产欧美日韩精品高清二区综合区| 亚洲香蕉久久| 国产亚洲毛片| 亚洲在线一区| 亚洲精品乱码| 国产精品分类| 日韩欧美精品| 国产伦理久久久久久妇女| 精品视频亚洲| 国产精品腿扒开做爽爽爽挤奶网站| 国产精品地址| 蜜臀av在线播放一区二区三区| 国产精品天堂蜜av在线播放| 亚洲大片在线| 国产伦理久久久久久妇女| 日韩一区电影| 蜜芽一区二区三区| 亚洲精品一区三区三区在线观看| 欧美色综合网| 99国产精品| 精品精品99| 日本成人在线视频网站| 欧美三区四区| 蜜桃久久久久| 美女国产精品| 久久蜜桃精品| 久久中文字幕一区二区三区| 日韩精品一级二级| 福利片在线一区二区| 亚洲精品自拍| 免费欧美一区| av最新在线| 久久av网站| 日本国产欧美| 久久精品影视| 精品视频一区二区三区在线观看| 视频精品一区| 日韩专区欧美专区| 国产综合视频| 亚洲一区资源| 久久精品国产福利| 国产欧美亚洲精品a| 免费人成在线不卡| 久久在线免费| 亚洲一级少妇| 国产精品99一区二区三区| 国产精品久久久久久久久久妞妞| 亚洲另类黄色| 日韩在线一区二区| 999国产精品视频| 午夜精品亚洲| 精品亚洲a∨| 蜜臀久久99精品久久久画质超高清| 伊人网在线播放| 亚洲黄色中文字幕| 成人午夜亚洲| 亚洲精品在线影院| 欧美日韩一区二区综合| 亚洲网站视频| 亚洲欧美久久久| 亚洲精品亚洲人成在线观看| 日韩一区免费| 国产精品国产三级在线观看| 久久精品资源| 国产激情久久| 精品美女久久| 亚洲播播91| 黄色亚洲在线| 亚洲一区二区三区久久久| 日韩午夜视频在线| 国产欧美日韩免费观看| 久久久久黄色| 99精品美女| 视频一区二区三区中文字幕| 91精品日本| 国产精品yjizz视频网| 欧美日韩在线二区| 中文一区一区三区免费在线观 | 日韩天堂在线| 国产精品7m凸凹视频分类| 亚洲制服欧美另类| 麻豆国产精品| 激情久久中文字幕| 亚洲影院天堂中文av色| 国产精品亚洲二区| 激情综合在线| 欧美日韩亚洲一区三区| 久久婷婷久久| 日韩av不卡在线观看| 人在线成免费视频| 蜜乳av另类精品一区二区| 国产精品一区二区三区av| 免费看av不卡| 亚洲字幕久久| 国产精品久久久久久久久久10秀 | 亚洲一区二区三区四区五区午夜 | 国产日韩一区| 日本在线精品| 亚洲精品看片| 国产欧洲在线| 蜜桃av一区二区在线观看| 精品午夜av| 国产精品免费看| 久久99久久久精品欧美| 9国产精品视频| 麻豆精品少妇| 欧美色图一区| 国产极品久久久久久久久波多结野 | 日韩理论视频| 久久国产88| 成人在线视频免费| 久久亚洲欧美| 日韩1区在线| 亚洲精品影视| 欧美日韩在线播放视频| 久久国产乱子精品免费女| 久久国产毛片| 国产精品久久久久久久久久白浆| 黄色成人91| 91偷拍一区二区三区精品| 中文字幕成人|