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

您的位置:首頁技術(shù)文章
文章詳情頁

教你怎么使用Java實(shí)現(xiàn)WebSocket

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

WebSocket協(xié)議通過在客戶端和服務(wù)端之間提供全雙工通信來進(jìn)行Web和服務(wù)器的交互功能。

在WebSocket應(yīng)用程序中,服務(wù)器發(fā)布WebSocket端點(diǎn),客戶端使用url連接到服務(wù)器。建立連接后,服務(wù)器和客戶端就可以互相發(fā)送消息。客戶端通常連接到一臺(tái)服務(wù)器,服務(wù)器接受多個(gè)客戶端的連接。

1.1 WebSocket協(xié)議

WebSocket協(xié)議有兩個(gè)部分:握手和傳輸。客戶端通過向服務(wù)端URL發(fā)送握手請求來建立連接。握手與現(xiàn)有的基于HTTP的基礎(chǔ)結(jié)構(gòu)相兼容。Web服務(wù)器將其解釋為升級版的HTTP連接請求。一個(gè)客戶端建立連接的握手請求:

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

一個(gè)服務(wù)端響應(yīng):

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

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

教你怎么使用Java實(shí)現(xiàn)WebSocket

1.2 WebSocket支持的消息類型

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

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

ws代表未加密的連接,默認(rèn)端口是80wss代表加密的連接,默認(rèn)端口是443path:表示服務(wù)器內(nèi)端點(diǎn)的位置query:路徑參數(shù)信息

二、創(chuàng)建一個(gè)WebSocket程序

創(chuàng)建和部署WebSocket端點(diǎn)的過程如下:1、創(chuàng)建一個(gè)端點(diǎn)類2、實(shí)現(xiàn)端點(diǎn)的生命周期方法3、將業(yè)務(wù)邏輯添加到端點(diǎn)4、將端點(diǎn)部署到Web應(yīng)用程序中

注意:與Servlet相反,WebSocket端點(diǎn)類會(huì)被實(shí)例化多次,容器針對與其部署的URI的每個(gè)連接都創(chuàng)建一個(gè)實(shí)例。每個(gè)實(shí)例都與一個(gè)連接相關(guān)聯(lián)。因?yàn)樵谌魏螘r(shí)間都只有一個(gè)線程執(zhí)行端點(diǎn)實(shí)例的代碼,所以有助于保持每個(gè)連接的用戶狀態(tài)簡化開發(fā)。

2.1 生命周期方法

EndPoint類中定義了三個(gè)生命周期方法:onOpen、onClose、onError使用注解方式創(chuàng)建服務(wù)類

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

@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()); }}

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

2.3 維護(hù)客戶狀態(tài)

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

@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 數(shù)據(jù)格式的編碼與解碼

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

Encoder.Text 用于文本消息Encoder.Binary 用于二進(jìn)制消息

使用方法:

1、創(chuàng)建編解碼類

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、在端點(diǎn)類注解中添加該Encoder

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

3、這時(shí)候就可以發(fā)送MessageA和MessageB兩種類型的Text數(shù)據(jù)

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

注意:webSocket會(huì)自動(dòng)尋找使用哪種編碼器,所以發(fā)送數(shù)據(jù)統(tǒng)一使用sendObject即可

Decoder

實(shí)現(xiàn)Decoder以將WebSocket消息轉(zhuǎn)換為Java對象

Decoder.Text 用于文本消息 Decoder.Binary 用于二進(jìn)制消息

使用方法

與Encoder類似

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

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

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、在端點(diǎn)類中添加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... }}

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

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品毛片久久| 91免费精品| 亚洲va久久久噜噜噜久久| 69精品国产久热在线观看| 国产精品久久久久久久久久妞妞| 日本久久综合| 亚洲激情不卡| 国产剧情在线观看一区| 98精品视频| 中文亚洲欧美| 免费视频一区二区三区在线观看 | 欧美91在线|欧美| 亚洲伦乱视频| 天堂精品久久久久| 国产a亚洲精品| 亚洲资源av| 高潮久久久久久久久久久久久久| 亚洲大全视频| 国产精品中文| 欧美日韩少妇| 麻豆久久一区| 天堂成人免费av电影一区| 欧美激情精品| 亚洲欧美日本视频在线观看| 久久97久久97精品免视看秋霞| 999国产精品视频| 国产精品毛片视频| 在线一区欧美| 国产精品99视频| 蜜桃av一区二区| 福利一区在线| 日本午夜精品久久久| 亚洲欧美一区在线| 精品国产乱码久久久久久1区2匹 | 亚洲深爱激情| 成人三级高清视频在线看| 亚洲精品婷婷| 亚洲高清二区| 久久伊人国产| 亚洲不卡视频| 激情综合网站| 国产精选在线| 国产精品第一| 蜜桃视频在线观看一区二区| 日韩一区电影| 国产精品**亚洲精品| 蜜桃一区二区三区在线| 久久久成人网| 国模精品一区| 久久狠狠久久| 亚洲伊人精品酒店| 亚洲精品电影| 播放一区二区| 久久精品理论片| 欧美一区二区三区免费看| 视频一区视频二区中文| 国产主播一区| 日韩精品不卡一区二区| 国产日韩欧美一区在线| 免费精品视频在线| 亚洲二区三区不卡| 久久视频一区| 日本蜜桃在线观看视频| 国产精品毛片久久久| 日韩中文字幕在线一区| 久久亚洲精品伦理| 激情久久中文字幕| 天堂av在线| 精品日韩在线| 国产精品一区二区三区美女 | 午夜一级在线看亚洲| 91精品亚洲| 亚洲风情在线资源| 精品久久久中文字幕| 国产精品久久久久av蜜臀| 91成人福利| 日本久久一区| 日本亚洲最大的色成网站www | 国产精选一区| 日韩久久一区| 亚洲一二三区视频| 日韩午夜电影| 午夜精品网站| 国模 一区 二区 三区| 视频福利一区| 日韩毛片视频| 日韩精品午夜| 国产一区亚洲| 亚洲精品国产偷自在线观看| 免费黄色成人| 欧美成人亚洲| 91久久国产| 尤物精品在线| 国产农村妇女精品一区二区| 伊人精品在线| 视频一区视频二区中文字幕| 天堂va蜜桃一区二区三区| 玖玖精品视频| 亚洲精品自拍| 91精品丝袜国产高跟在线| 日韩一区二区三区在线看| 日韩一区二区三区免费视频| 日本va欧美va欧美va精品| 国产欧美日韩亚洲一区二区三区| 欧美片第1页综合| 国产高清视频一区二区| 久久男人av| 日韩精品诱惑一区?区三区| 久久久久免费av| 国产精品日韩| 青草国产精品| 国产一区二区三区亚洲| 亚洲综合在线电影| av不卡免费看| 日本午夜精品一区二区三区电影 | 日韩精品欧美| 在线视频亚洲| 在线看片日韩| 国产欧美精品久久| 成人高清一区| 激情婷婷综合| 亚洲欧美一级| 国产精品qvod| 亚洲电影有码| 亚洲小说春色综合另类电影| 久久黄色影视| www.51av欧美视频| 国产日韩专区| 国产日韩欧美一区二区三区| 福利一区视频| 久久xxxx| 国产精品a级| 午夜精品久久久久久久久久蜜桃| 亚洲激情社区| 国产精品亚洲二区| 99tv成人| 欧美一区自拍| 五月激情久久| 亚洲久久一区| av中文资源在线资源免费观看| 国产亚洲精品v| 美女视频免费精品| 狠狠久久婷婷| 国产精品magnet| 欧美国产91| 国产亚洲一卡2卡3卡4卡新区| 麻豆理论在线观看| 热久久久久久久| 卡一精品卡二卡三网站乱码| 欧美日韩国产亚洲一区| 国产精品v日韩精品v欧美精品网站 | 日韩av自拍| 日韩精品一卡二卡三卡四卡无卡| 麻豆一区在线| 亚洲激情五月| 麻豆精品av| 黄色日韩在线| 你懂的国产精品永久在线| 久久久男人天堂| 99在线|亚洲一区二区| 91九色综合| 人人香蕉久久| 亚洲尤物av| 日本久久一区| 精品99在线| 亚洲精品影视| 91精品蜜臀一区二区三区在线| 青草国产精品| 国产日韩专区| 天使萌一区二区三区免费观看| 久久不卡日韩美女| 日本免费在线视频不卡一不卡二| 国产免费成人| 欧美a级一区| 日韩欧美少妇| 成人日韩av| 美女在线视频一区| 日韩不卡免费视频| 综合激情一区| 久久亚洲图片| 狠狠爱成人网| 米奇777超碰欧美日韩亚洲| 亚洲午夜天堂| 精品九九久久| 国产免费播放一区二区| 亚洲精品成人一区| 在线国产精品一区| 夜夜精品视频| 亚洲激情另类| 精品1区2区3区4区| 五月天综合网站| 国产99精品| 99久久婷婷这里只有精品| 久久夜夜操妹子| 肉色欧美久久久久久久免费看| 精品久久久久中文字幕小说| 美腿丝袜亚洲三区| 国产高清视频一区二区| 国产精品永久| 国产精品一区二区三区美女|