欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

前言

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

一、Websocket 概述

1.1 定義

Websocket 是一種在單個 TCP 連接上進(jìn)行全雙工通信的協(xié)議。它允許客戶端和服務(wù)器之間進(jìn)行實時的、雙向的數(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é)議在建立連接時需要進(jìn)行握手。客戶端首先向服務(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 消息主要有兩種格式:文本格式和二進(jìn)制格式。消息以幀(frame)為單位進(jìn)行傳輸,一個完整的消息可以由一個或多個幀組成。
文本消息以 UTF - 8 編碼進(jìn)行傳輸,方便處理文本數(shù)據(jù),如聊天消息等。二進(jìn)制格式則適用于傳輸圖像、音頻、視頻等二進(jìn)制數(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é)束語

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

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

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

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

相關(guān)文章

  • 基于jvm java內(nèi)存區(qū)域的介紹

    基于jvm java內(nèi)存區(qū)域的介紹

    下面小編就為大家?guī)硪黄趈vm java內(nèi)存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java多線程之線程池七個參數(shù)詳解

    Java多線程之線程池七個參數(shù)詳解

    這篇文章主要介紹了Java多線程之線程池七個參數(shù)詳解,文中有很詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java 讀取PDF中的文本和圖片的方法

    Java 讀取PDF中的文本和圖片的方法

    本文將介紹通過Java程序來讀取PDF文檔中的文本和圖片的方法。分別調(diào)用方法extractText()和extractImages()來讀取,需要的朋友可以參考下
    2019-07-07
  • IDEA設(shè)置生成帶注釋的getter和setter的圖文教程

    IDEA設(shè)置生成帶注釋的getter和setter的圖文教程

    通常我們用idea默認(rèn)生成的getter和setter方法是不帶注釋的,當(dāng)然,我們同樣可以設(shè)置idea像MyEclipse一樣生成帶有Javadoc的模板,具體設(shè)置方法,大家參考下本文
    2018-05-05
  • MyBatis自定義類型轉(zhuǎn)換器實現(xiàn)加解密

    MyBatis自定義類型轉(zhuǎn)換器實現(xiàn)加解密

    這篇文章主要介紹了MyBatis自定義類型轉(zhuǎn)換器實現(xiàn)加解密的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Java屬性文件操作之Properties與ResourceBundle詳解

    Java屬性文件操作之Properties與ResourceBundle詳解

    這篇文章主要介紹了Java屬性文件操作之Properties與ResourceBundle詳解,兩個類都可以讀取屬性文件中以key/value形式存儲的鍵值對,ResourceBundle讀取屬性文件時操作相對簡單,需要的朋友可以參考下
    2023-11-11
  • springmvc下實現(xiàn)登錄驗證碼功能示例

    springmvc下實現(xiàn)登錄驗證碼功能示例

    本篇文章主要介紹了springmvc下實現(xiàn)登錄驗證碼功能示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 移除元素Java實現(xiàn)方式

    移除元素Java實現(xiàn)方式

    這篇文章主要介紹了移除元素Java實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java報錯非法的前向引用問題

    java報錯非法的前向引用問題

    這篇文章主要介紹了java報錯非法的前向引用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 5種必會的Java異步調(diào)用轉(zhuǎn)同步的方法你會幾種

    5種必會的Java異步調(diào)用轉(zhuǎn)同步的方法你會幾種

    這篇文章主要介紹了5種必會的Java異步調(diào)用轉(zhuǎn)同步的方法你會幾種,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論