最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA 日常開發(fā)中Websocket示例詳解

 更新時間:2024年12月10日 10:28:29   作者:xcLeigh  
JAVA |日常開發(fā)中Websocket詳解,WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,它在Web應(yīng)用中實現(xiàn)了客戶端與服務(wù)器之間的實時數(shù)據(jù)傳輸,本文將詳細介紹Java開發(fā)中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事項,感興趣的朋友一起看看吧

JAVA |日常開發(fā)中Websocket詳解,WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,它在Web應(yīng)用中實現(xiàn)了客戶端與服務(wù)器之間的實時數(shù)據(jù)傳輸。與HTTP不同,WebSocket在建立連接后,客戶端和服務(wù)器都可以隨時向?qū)Ψ桨l(fā)送數(shù)據(jù),而無需像HTTP那樣每次請求都需要建立新的連接。這使得WebSocket非常適合需要實時通信的場景,如在線聊天、實時通知、股票行情推送等。本文將詳細介紹Java開發(fā)中WebSocket的使用,包括基本概念、Java API、使用示例以及注意事項。

前言

在數(shù)字浪潮洶涌澎湃的時代,程序開發(fā)宛如一座神秘而宏偉的魔法城堡,矗立在科技的浩瀚星空中。代碼的字符,似那閃爍的星辰,按照特定的軌跡與節(jié)奏,組合、交織、碰撞,即將開啟一場奇妙且充滿無限可能的創(chuàng)造之旅。當(dāng)空白的文檔界面如同深邃的宇宙等待探索,程序員們則化身無畏的星辰開拓者,指尖在鍵盤上輕舞,準(zhǔn)備用智慧與邏輯編織出足以改變世界運行規(guī)則的程序畫卷,在 0 和 1 的二進制世界里,鐫刻下屬于人類創(chuàng)新與突破的不朽印記。

一、Websocket 概述

1.1 定義

Websocket 是一種在單個 TCP 連接上進行全雙工通信的協(xié)議。它允許客戶端和服務(wù)器之間進行實時的、雙向的數(shù)據(jù)傳輸,與傳統(tǒng)的 HTTP 請求 - 響應(yīng)模式不同,HTTP 是單向的,客戶端請求,服務(wù)器響應(yīng)后連接就關(guān)閉,而 Websocket 保持連接打開,以便隨時交換數(shù)據(jù)。
例如,在一個實時聊天應(yīng)用中,Websocket 可以讓客戶端(如瀏覽器)和服務(wù)器之間實時地發(fā)送和接收聊天消息,而不需要像傳統(tǒng)的 HTTP 輪詢那樣頻繁地發(fā)送請求來檢查是否有新消息。

1.2 優(yōu)勢

實時性高:能夠?qū)崿F(xiàn)服務(wù)器和客戶端之間的實時通信,數(shù)據(jù)可以即時地在雙方之間傳遞,減少了延遲。這對于需要實時更新數(shù)據(jù)的應(yīng)用場景,如股票交易平臺、在線游戲等非常關(guān)鍵。
高效節(jié)能:相較于傳統(tǒng)的 HTTP 輪詢(客戶端定時向服務(wù)器發(fā)送請求來獲取最新信息),Websocket 避免了頻繁建立和斷開連接的開銷,從而節(jié)省了網(wǎng)絡(luò)資源和服務(wù)器資源,提高了效率。
跨平臺支持:Websocket 協(xié)議是基于 TCP 協(xié)議的,并且在現(xiàn)代瀏覽器和大多數(shù)服務(wù)器環(huán)境中都有良好的支持,這使得它可以方便地用于開發(fā)跨平臺的實時應(yīng)用。

二、Websocket 協(xié)議基礎(chǔ)

2.1 握手過程

Websocket 協(xié)議在建立連接時需要進行握手。客戶端首先向服務(wù)器發(fā)送一個 HTTP 請求,這個請求中包含一些特殊的頭部信息,用于表明這是一個 Websocket 請求。例如,請求頭中包含Upgrade: websocket和Connection: Upgrade字段,用于請求將協(xié)議從 HTTP 升級到 Websocket。
服務(wù)器收到請求后,如果支持 Websocket 協(xié)議并且同意升級,會返回一個響應(yīng),其中包含101 Switching Protocols狀態(tài)碼,表示協(xié)議切換成功,之后雙方就建立了 Websocket 連接。

2.2 消息格式

Websocket 消息主要有兩種格式:文本格式和二進制格式。消息以幀(frame)為單位進行傳輸,一個完整的消息可以由一個或多個幀組成。
文本消息以 UTF - 8 編碼進行傳輸,方便處理文本數(shù)據(jù),如聊天消息等。二進制格式則適用于傳輸圖像、音頻、視頻等二進制數(shù)據(jù)。

2.3 數(shù)據(jù)傳輸方式

全雙工通信意味著客戶端和服務(wù)器都可以主動發(fā)送消息。在連接建立后,任何一方都可以隨時發(fā)送數(shù)據(jù),并且不需要等待對方的請求。例如,服務(wù)器可以主動向客戶端推送實時的股票價格變化,同時客戶端也可以向服務(wù)器發(fā)送交易指令。

三、Java 中使用 Websocket

3.1 Java WebSocket API(JSR - 356)

簡介:Java 提供了 WebSocket API 來方便地在 Java 應(yīng)用中實現(xiàn) Websocket 功能。這個 API 定義了客戶端和服務(wù)器端的接口,使得開發(fā)者可以輕松地構(gòu)建 Websocket 應(yīng)用。

服務(wù)器端實現(xiàn)示例:

首先,創(chuàng)建一個@ServerEndpoint注解的類來表示 Websocket 服務(wù)器端點。

import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")
public class ChatServer {
    @OnMessage
    public String onMessage(String message) {
        // 簡單的消息處理,例如將消息轉(zhuǎn)換為大寫
        return message.toUpperCase();
    }
}

在上述示例中,@ServerEndpoint("/chat")注解定義了 Websocket 服務(wù)器端點的路徑為/chat。@OnMessage注解標(biāo)記的方法會在收到消息時被調(diào)用,這里只是簡單地將收到的消息轉(zhuǎn)換為大寫并返回。

客戶端實現(xiàn)示例:

客戶端需要創(chuàng)建一個WebSocketContainer來建立連接并發(fā)送和接收消息。

import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.net.URI;
public class ChatClient {
    public static void main(String[] args) {
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            String uri = "ws://localhost:8080/chat";
            javax.websocket.Session session = container.connectToServer(ChatClientEndpoint.class, new URI(uri));
            // 發(fā)送消息
            session.getBasicRemote().sendText("Hello");
            // 接收消息
            String response = session.getBasicRemote().receiveText();
            System.out.println("收到回復(fù): " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在這個客戶端示例中,首先獲取WebSocketContainer,然后通過connectToServer方法連接到服務(wù)器端點。之后可以使用sendText發(fā)送消息,使用receiveText接收消息。

3.2 第三方庫(如 Tyrus)

簡介:Tyrus 是一個流行的 Websocket 實現(xiàn)庫,它提供了豐富的功能和更好的性能。它是 Java EE 規(guī)范的參考實現(xiàn),支持 JSR - 356 標(biāo)準(zhǔn)。

示例代碼(服務(wù)器端):

添加 Tyrus 依賴到項目(以 Maven 為例)。

<dependency>
    <groupId>org.glassfish.tyrus - servlet</groupId>
    <artifactId>tyrus - servlet</artifactId>
    <version>1.15</version>
</dependency>

創(chuàng)建服務(wù)器端點類。

import org.glassfish.tyrus.server.Server;
public class TyrusChatServer {
    public static void main(String[] args) {
        Server server = new Server("localhost", 8080, "/", null, ChatServerEndpoint.class);
        try {
            server.start();
            System.out.println("服務(wù)器已啟動");
            // 保持服務(wù)器運行
            Thread.sleep(Long.MAX_VALUE);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            server.stop();
        }
    }
}

其中ChatServerEndpoint類可以類似于前面 JSR - 356 中的服務(wù)器端點類定義,用于處理消息。

示例代碼(客戶端):

同樣需要添加 Tyrus 客戶端依賴。

<dependency>
    <groupId>org.glassfish.tyrus - client</groupId>
    <artifactId>tyrus - client</artifactId>
    <version>1.15</version>
</dependency>

客戶端連接和消息發(fā)送接收示例。

import org.glassfish.tyrus.client.ClientManager;
import javax.websocket.Session;
import java.io.IOException;
import java.net.URI;
public class TyrusChatClient {
    public static void main(String[] args) {
        try {
            ClientManager clientManager = new ClientManager();
            String uri = "ws://localhost:8080/chat";
            Session session = clientManager.connectToServer(ChatClientEndpoint.class, new URI(uri));
            // 發(fā)送消息
            session.getBasicRemote().sendText("Hello");
            // 接收消息
            String response = session.getBasicRemote().receiveText();
            System.out.println("收到回復(fù): " + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

四、應(yīng)用場景

4.1 實時聊天應(yīng)用

這是 Websocket 最典型的應(yīng)用場景之一。用戶在瀏覽器中打開聊天界面,通過 Websocket 與服務(wù)器建立連接。當(dāng)用戶發(fā)送聊天消息時,消息通過 Websocket 即時傳輸?shù)椒?wù)器,服務(wù)器再將消息轉(zhuǎn)發(fā)給其他相關(guān)用戶的客戶端,實現(xiàn)實時聊天功能。

4.2 實時數(shù)據(jù)推送(如股票行情、體育賽事比分)

對于需要實時更新數(shù)據(jù)的應(yīng)用,如金融領(lǐng)域的股票行情監(jiān)控應(yīng)用,Websocket 可以讓服務(wù)器在股票價格發(fā)生變化時,立即將最新價格推送給客戶端。體育賽事比分更新也是類似的,觀眾可以在瀏覽器中實時看到比分的變化,而不需要手動刷新頁面。

4.3 在線游戲

在多人在線游戲中,Websocket 用于實時同步玩家的操作和游戲狀態(tài)。例如,在一個多人競技游戲中,玩家的移動、攻擊等操作可以通過 Websocket 即時傳輸?shù)椒?wù)器,服務(wù)器再將這些信息廣播給其他玩家,確保游戲的實時性和公平性。

結(jié)束語

親愛的朋友,無論前路如何漫長與崎嶇,都請懷揣夢想的火種,因為在生活的廣袤星空中,總有一顆屬于你的璀璨星辰在熠熠生輝,靜候你抵達。

愿你在這紛繁世間,能時常收獲微小而確定的幸福,如春日微風(fēng)輕拂面龐,所有的疲憊與煩惱都能被溫柔以待,內(nèi)心永遠充盈著安寧與慰藉。

至此,文章已至尾聲,而您的故事仍在續(xù)寫,不知您對文中所敘有何獨特見解?期待您在心中與我對話,開啟思想的新交流。

到此這篇關(guān)于JAVA 日常開發(fā)中Websocket示例詳解的文章就介紹到這了,更多相關(guān)java Websocket內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合kaptcha驗證碼過程(復(fù)制粘貼即可用)

    SpringBoot整合kaptcha驗證碼過程(復(fù)制粘貼即可用)

    本文介紹了如何在Spring Boot項目中整合Kaptcha驗證碼實現(xiàn),通過配置和編寫相應(yīng)的Controller、工具類以及前端頁面,可以生成和驗證驗證碼,文中指出了在項目結(jié)構(gòu)上的注意事項,避免因包結(jié)構(gòu)問題導(dǎo)致驗證碼無法顯示
    2025-01-01
  • springboot解決XSS存儲型漏洞問題

    springboot解決XSS存儲型漏洞問題

    這篇文章主要介紹了springboot解決XSS存儲型漏洞問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • idea與eclipse項目相互導(dǎo)入的過程(圖文教程)

    idea與eclipse項目相互導(dǎo)入的過程(圖文教程)

    這篇文章主要介紹了idea與eclipse項目相互導(dǎo)入的過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • spring為類的靜態(tài)屬性實現(xiàn)注入實例方法

    spring為類的靜態(tài)屬性實現(xiàn)注入實例方法

    在本篇文章里小編給大家整理的是關(guān)于spring為類的靜態(tài)屬性實現(xiàn)注入實例方法,有需要的朋友們可以參考下。
    2019-10-10
  • idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean

    idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean

    本文主要介紹了idea中無法自動裝配未找到 ‘XXXXXXX‘ 類型的 Bean的原因及三種解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • java解析json數(shù)組方式

    java解析json數(shù)組方式

    這篇文章主要介紹了java解析json數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換

    Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換

    Jackson是一個強大工具,可用于Json、XML、實體之間的相互轉(zhuǎn)換,JacksonXmlElementWrapper用于指定List等集合類,外圍標(biāo)簽名,JacksonXmlProperty指定包裝標(biāo)簽名,或者指定標(biāo)簽內(nèi)部屬性名,JacksonXmlRootElement指定生成xml根標(biāo)簽的名字,JacksonXmlText指定當(dāng)前這個值
    2024-05-05
  • Java?延時隊列及簡單使用方式詳解

    Java?延時隊列及簡單使用方式詳解

    這篇文章主要介紹了Java延時隊列簡單使用方式,通過本文學(xué)習(xí)知道延時隊列是什么可以用來干什么,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Java web spring異步方法實現(xiàn)步驟解析

    Java web spring異步方法實現(xiàn)步驟解析

    這篇文章主要介紹了Java web spring異步方法實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 如何合理使用Spring的事務(wù)方式

    如何合理使用Spring的事務(wù)方式

    這篇文章主要介紹了如何合理使用Spring的事務(wù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05

最新評論

孟津县| 辰溪县| 洞头县| 鲁甸县| 三门县| 石泉县| 邢台县| 郯城县| 四川省| 自治县| 大名县| 牙克石市| 平乐县| 凤翔县| 林周县| 泸西县| 永登县| 和静县| 博客| 西青区| 天峨县| 罗平县| 云南省| 遵义县| 邛崃市| 娄烦县| 双柏县| 海城市| 仪陇县| 柯坪县| 永顺县| 阿荣旗| 轮台县| 霸州市| 天门市| 灵丘县| 云和县| 龙南县| 淮滨县| 白河县| 西城区|