91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Java實現WebSocket

發布時間:2021-05-08 10:39:19 來源:億速云 閱讀:2814 作者:小新 欄目:開發技術

這篇文章主要介紹如何使用Java實現WebSocket,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Java可以用來干什么

Java主要應用于:1. web開發;2. Android開發;3. 客戶端開發;4. 網頁開發;5. 企業級應用開發;6. Java大數據開發;7.游戲開發等。

一、WebSocket簡介

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

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

1.1 WebSocket協議

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

GET /path/to/websocket/endpoint HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://localhost
Sec-WebSocket-Version: 13

一個服務端響應:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-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?query
wss://host:port/path?query

ws代表未加密的連接,默認端口是80
wss代表加密的連接,默認端口是443
path:表示服務器內端點的位置
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方法中使用

@OnMessage
public 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”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涡阳县| 金山区| 衡水市| 龙游县| 茌平县| 南丰县| 江西省| 塘沽区| 泽州县| 昌黎县| 正宁县| 榆树市| 揭东县| 泗阳县| 浦北县| 桦川县| 合川市| 河北省| 五莲县| 咸宁市| 电白县| 钦州市| 江川县| 碌曲县| 大厂| 西藏| 柯坪县| 沿河| 金昌市| 将乐县| 乌审旗| 青龙| 通山县| 长乐市| 米林县| 南华县| 内乡县| 德惠市| 资中县| 永春县| 铜梁县|