国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

教你怎么使用Java實現WebSocket

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

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

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

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來作為該連接的連接憑證??蛻舳讼蚍斩税l送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
相關文章:
主站蜘蛛池模板: 国产精品麻豆一区二区三区v视界 | 杨幂精品国产专区91在线 | 女人张开腿给男人捅 | 一级待一黄aaa大片在线还看 | 免费毛片视频网站 | 草草影院在线播放 | 精品国产成人在线 | 国产精品免费久久久免费 | 精品一区二区三区在线视频 | 国产精品久久久久久久久免费hd | 看一级毛片一区二区三区免费 | 国产在线一区二区三区四区 | 免费成年网站 | 国产在线91精品天天更新 | 九九视频免费观看 | 美国的毛片免费的 | 在线观看免费视频网站色 | 国产乱码精品一区二区三上 | 亚洲精品男人天堂 | 国产高清在线看 | 国产亚洲男人的天堂在线观看 | 久久国产成人精品 | 中国美女黄色一级片 | 欧美视频一区在线观看 | 草久久久 | 亚洲在线偷拍自拍 | 久草看片| 一本色道久久88加勒比—综合 | 日韩1级片 | 99久久免费中文字幕精品 | 日韩欧美在线视频观看 | 国产手机视频 | 国产九区 | 欧美巨大精品欧美一区二区 | 亚洲加勒比久久88色综合一区 | 青青草国产一区二区三区 | 国产午夜免费不卡精品理论片 | 欧美一级片观看 | 日本一区二区高清不卡 | 欧美成人影院在线观看三级 | 18女人毛片大全 |