国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了教你怎么使用Java實現(xiàn)WebSocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、WebSocket簡介
WebSocket協(xié)議通過在客戶端和服務端之間提供全雙工通信來進行Web和服務器的交互功能。

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

1.1 WebSocket協(xié)議
WebSocket協(xié)議有兩個部分:握手和傳輸??蛻舳送ㄟ^向服務端URL發(fā)送握手請求來建立連接。握手與現(xiàn)有的基于HTTP的基礎(chǔ)結(jié)構(gòu)相兼容。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來作為該連接的連接憑證。
客戶端向服務端發(fā)送WebSocketKey,服務器根據(jù)WebSocketKey生成WebSocketAccept返回給客戶端,客戶端對WebSocketKey的值再進行相同的操作,如果與服務器返回的Accept的值相匹配,就表示握手成功。握手之后客戶端與服務端就互相發(fā)送消息。
java websocket服務器,java,websocket,網(wǎng)絡(luò)
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:表示服務器內(nèi)端點的位置
query:路徑參數(shù)信息

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

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

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

@ServerEndpoint("/echo")
public class EchoEndpoint {
   @OnMessage
   public void onMessage(Session session, String msg) {
      try {
         session.getBasicRemote().sendText(msg);
      } catch (IOException e) { ... }
   }
}

2.2 業(yè)務邏輯方法

@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 維護客戶狀態(tài)
有時在程序中我們可能需要在連接中維護一些用戶參數(shù),WebSocket也提供了這樣的服務
Session.getUserProperties獲取用戶參數(shù)信息
如果要存儲所有連接的客戶端共有的信息,可以使用靜態(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ù)格式的編碼與解碼
由于客戶端和服務端交互可能涉及數(shù)據(jù)格式的轉(zhuǎn)換,所以提供了Decoder和Encoder的方式解決。
同時由于WebSocket的@Message注解只能有一個用來傳輸Text信息或Binary信息,所以要進行最常用的Json->entity轉(zhuǎn)換解析就需要該方法
Encoder

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

使用方法:

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

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

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

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

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

Decoder

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

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

與Encoder類似

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

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方法中使用文章來源地址http://www.zghlxwxcb.cn/news/detail-796941.html

@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...
   }
}

到了這里,關(guān)于教你怎么使用Java實現(xiàn)WebSocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Java 構(gòu)建websocket客戶端,構(gòu)建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務器端,接收服務器端消息

    Java 構(gòu)建websocket客戶端,構(gòu)建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務器端,接收服務器端消息 回調(diào)函數(shù)處理

    2024年02月13日
    瀏覽(32)
  • Java 實現(xiàn)使用 Websocket 發(fā)送消息

    Java 實現(xiàn)使用 Websocket 發(fā)送消息

    需求背景:之前做了個樓棟房間數(shù)量出租了多少,需要在數(shù)據(jù)大屏上實時展示 解決方案:以切面攔截出租接口,當有房間出租時重新查詢相關(guān)數(shù)據(jù),封裝好用websocket實時傳送前端展示 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 WebSocket 是一種在單個TCP連接上進行全雙

    2024年03月27日
    瀏覽(22)
  • Java使用websocket實現(xiàn)消息實時通知

    博客僅做學習記錄使用。 做項目中遇到這樣一個實時通知需求,因為第一次接觸這個,期間查了很多資料,看了很多博客,最后實現(xiàn)功能,查詢的博客太多,就不一一放出來了,感謝各位大佬。 websocket方式主要代碼來源于這個大佬的博客: https://blog.csdn.net/moshowgame/article/d

    2024年02月08日
    瀏覽(31)
  • java使用WebSocket實現(xiàn)一對一實時對話

    java使用WebSocket實現(xiàn)一對一實時對話

    最近的項目中有實時對話的需求。這里也是查閱了很多的資料。使用webSocket實現(xiàn)一對一對話是最多的。 鏈接: https://pan.baidu.com/s/1Vn1e1qw7nRnU1_4R-4fcGg 提取碼: qwer? 邏輯講解: 現(xiàn)在我們要給張三豐發(fā)一個你好,我們要解決下面兩個問題 ·? 這個你好怎么展示在我的窗口 · ? 這個

    2023年04月09日
    瀏覽(30)
  • 如何使用Java Websocket實現(xiàn)實時數(shù)據(jù)監(jiān)控功能?

    隨著互聯(lián)網(wǎng)應用的不斷發(fā)展,實時數(shù)據(jù)監(jiān)控功能成為了許多應用的必備功能之一。本文將介紹如何使用Java WebSocket實現(xiàn)實時數(shù)據(jù)監(jiān)控功能,并提供具體的代碼示例。 :Java WebSocket、實時數(shù)據(jù)監(jiān)控、代碼示例 一、什么是WebSocket? WebSocket是一種網(wǎng)絡(luò)協(xié)議,可以在實現(xiàn)了We

    2024年02月03日
    瀏覽(25)
  • JAVA使用WebSocket實現(xiàn)多客戶端請求

    工作前提:兩個服務之間實現(xiàn)聊天通訊,因為介于兩個服務,兩個客戶端 方案1:多個服務端,多個客戶端,使用redis把用戶數(shù)據(jù)ip進行存儲,交互拿到redis數(shù)據(jù)進行推送 方案2: 一個服務端,多個客戶端,拿到客戶端的id和需要推送的id進行拼接存儲 此文章使用的是方案2 1. 引

    2024年02月11日
    瀏覽(17)
  • 一小時教你用SpringBoot+WebSocket+WebRTC實現(xiàn)視頻通話

    1. 運行結(jié)果 SpringBoot+WebSocket+WebRTC實現(xiàn)視頻通話 上述運行結(jié)果中是有聲音(比較小而已)及動的畫面的(畫面不是靜止的)。 網(wǎng)上關(guān)于webrtc的文檔(文章)和視頻也挺多的,但是用SpringBoot結(jié)合WebRTC的卻屈指可數(shù),前一段時間小編我學習了一下WebRTC的相關(guān)知識,于是用SpringBoot+WebRTC實現(xiàn)

    2024年02月10日
    瀏覽(12)
  • uniapp:實現(xiàn)手機端APP登錄強制更新,從本地服務器下載新的apk更新,并使用WebSocket,實時強制在線用戶更新

    uniapp:實現(xiàn)手機端APP登錄強制更新,從本地服務器下載新的apk更新,并使用WebSocket,實時強制在線用戶更新

    實現(xiàn)登錄即更新,或?qū)崟r監(jiān)聽更新 本文介紹的是在 App打開啟動 的時候調(diào)用更新,點擊下方鏈接,查看使用 WebSocket 實現(xiàn) 實時 通知 在線用戶 更新。 uniapp:全局消息是推送,實現(xiàn)app在線更新,WebSocket,apk上傳: 背景 :內(nèi)部手持機app開發(fā)功能,需要更新的到車間各個手持機上。

    2024年02月03日
    瀏覽(25)
  • 幻獸帕魯4人以上聯(lián)機怎么辦?教你一鍵搭建幻獸帕魯服務器

    幻獸帕魯4人以上聯(lián)機怎么辦?教你一鍵搭建幻獸帕魯服務器

    幻獸帕魯4人以上聯(lián)機怎么辦?教你一鍵搭建幻獸帕魯服務器?!禤alworld(幻獸帕魯》大熱,同時在線峰值達到 203 萬。官方服務器問題時目前存在較多問題,即便官方維護和優(yōu)化不斷進行,但仍有大量玩家反饋頻繁遇到聯(lián)機失敗、無法加入官方服務器等問題。較多玩家更傾向

    2024年02月20日
    瀏覽(17)
  • 從零開始,手把手教你實現(xiàn)基于 Websocket 的微服務

    Websocket 協(xié)議是為了解決 HTTP 協(xié)議缺陷而產(chǎn)生的一種通信協(xié)議,它能夠在客戶端和服務器之間建立持久性的連接,并且允許雙向通信。 HTTP 協(xié)議的請求與響應模式,其實并不適合實時通信的場景。比如聊天室、在線游戲等應用,都需要實時地推送消息到客戶端,而 HTTP 協(xié)議則需

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包