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

Java中的WebSocket與實時通信詳解

 更新時間:2025年11月24日 10:02:19   作者:喵手  
本文介紹WebSocket的概念、工作原理及Java中實現(xiàn)WebSocket的技術(shù)手段,包括JavaAPIforWebSocket(JSR356)和SpringWebSocket,通過實際應(yīng)用場景(如即時聊天、實時通知、在線游戲)進(jìn)行了詳細(xì)分析,展示了WebSocket在現(xiàn)代Web應(yīng)用中的重要性,感興趣的朋友跟隨小編一起看看吧

開篇語

  今天我要給大家分享一些自己日常學(xué)習(xí)到的一些知識點(diǎn),并以文字的形式跟大家一起交流,互相學(xué)習(xí),一個人雖可以走的更快,但一群人可以走的更遠(yuǎn)。

  我是一名后端開發(fā)愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業(yè)余時間把自己所學(xué)到所會的,通過文章的形式進(jìn)行輸出,希望以這種方式幫助到更多的初學(xué)者或者想入門的小伙伴們,同時也能對自己的技術(shù)進(jìn)行沉淀,加以復(fù)盤,查缺補(bǔ)漏。

前言

在現(xiàn)代Web應(yīng)用中,用戶對實時互動的需求越來越高。無論是即時聊天、實時通知,還是在線多人游戲,實時通信已成為現(xiàn)代應(yīng)用的重要組成部分。傳統(tǒng)的HTTP請求/響應(yīng)模式已經(jīng)不能滿足實時數(shù)據(jù)交換的需求,而WebSocket作為一種支持全雙工通信的協(xié)議,為開發(fā)者提供了一個高效、低延遲的解決方案。Java為實現(xiàn)WebSocket通信提供了多種工具和框架,其中最常用的是Java API for WebSocket (JSR 356)Spring WebSocket

本文將深入探討WebSocket的概念、Java實現(xiàn)WebSocket的技術(shù)手段,并通過實際應(yīng)用場景(如即時聊天、實時通知、在線游戲)進(jìn)行詳細(xì)分析。

一、WebSocket概念:全雙工通信、長連接

1.1 WebSocket協(xié)議簡介

WebSocket協(xié)議是HTML5推出的一種網(wǎng)絡(luò)協(xié)議,用于在客戶端和服務(wù)器之間建立一個持久的、雙向的通信通道。與傳統(tǒng)的HTTP協(xié)議不同,WebSocket提供了全雙工通信方式,這意味著客戶端和服務(wù)器可以隨時相互發(fā)送消息,而不需要每次建立新的連接。這使得WebSocket特別適用于實時應(yīng)用場景。

WebSocket的特點(diǎn):

  • 全雙工通信:WebSocket支持客戶端和服務(wù)器之間的雙向數(shù)據(jù)流,可以同時發(fā)送和接收數(shù)據(jù),不像HTTP那樣只能從客戶端發(fā)起請求。
  • 長連接:WebSocket協(xié)議建立連接后,客戶端與服務(wù)器之間保持長時間的連接,直到手動關(guān)閉連接。這避免了頻繁建立和關(guān)閉連接的開銷。
  • 低延遲:由于WebSocket使用持久連接,數(shù)據(jù)交換不再受到傳統(tǒng)HTTP請求/響應(yīng)模型的限制,具有更低的延遲。

1.2 WebSocket工作原理

  • 建立連接:WebSocket連接由客戶端發(fā)起,客戶端通過HTTP請求與服務(wù)器進(jìn)行握手。服務(wù)器響應(yīng)HTTP請求并升級協(xié)議為WebSocket,連接建立成功。
  • 數(shù)據(jù)交換:一旦WebSocket連接建立,客戶端和服務(wù)器可以通過該連接進(jìn)行雙向數(shù)據(jù)傳輸。數(shù)據(jù)交換是基于WebSocket協(xié)議的幀結(jié)構(gòu)進(jìn)行的,數(shù)據(jù)幀通過WebSocket連接不斷發(fā)送。
  • 關(guān)閉連接:當(dāng)通信完成時,客戶端或服務(wù)器都可以發(fā)送關(guān)閉幀,關(guān)閉WebSocket連接。

WebSocket連接的三階段:

  • 握手階段:客戶端向服務(wù)器發(fā)起連接請求,服務(wù)器響應(yīng)并升級協(xié)議為WebSocket。
  • 數(shù)據(jù)傳輸階段:客戶端和服務(wù)器通過持久連接進(jìn)行雙向數(shù)據(jù)傳輸。
  • 關(guān)閉階段:通信完成后,客戶端或服務(wù)器發(fā)送關(guān)閉幀關(guān)閉連接。

二、Java實現(xiàn)WebSocket:Java API for WebSocket(JSR 356)、Spring WebSocket

2.1 Java API for WebSocket(JSR 356)

**Java API for WebSocket (JSR 356)**是Java EE7引入的標(biāo)準(zhǔn)API,旨在簡化WebSocket通信的實現(xiàn)。通過JSR 356,開發(fā)者可以輕松地在Java應(yīng)用中實現(xiàn)WebSocket服務(wù)器端和客戶端。

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

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/chat")
public class ChatEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("New connection: " + session.getId());
    }
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("Received message: " + message);
        session.getAsyncRemote().sendText("Echo: " + message);
    }
    @OnClose
    public void onClose(Session session) {
        System.out.println("Connection closed: " + session.getId());
    }
}

代碼解析:

  • @ServerEndpoint(“/chat”):標(biāo)注WebSocket端點(diǎn),客戶端可以通過ws://localhost:8080/chat進(jìn)行連接。
  • @OnOpen:當(dāng)WebSocket連接建立時調(diào)用,session.getId()可用來獲取客戶端的連接ID。
  • @OnMessage:當(dāng)接收到客戶端發(fā)送的消息時調(diào)用,session.getAsyncRemote().sendText()用于向客戶端發(fā)送消息。
  • @OnClose:當(dāng)WebSocket連接關(guān)閉時調(diào)用,釋放資源等。

啟動服務(wù)器

import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpointConfig;
import javax.servlet.ServletContext;
import org.apache.tomcat.websocket.server.WsSci;
public class WebSocketServer {
    public static void main(String[] args) {
        ServletContext context = new MyServletContext();
        ServerContainer container = (ServerContainer) context.getAttribute("javax.websocket.server.ServerContainer");
        container.addEndpoint(ChatEndpoint.class);
    }
}

2.2 Spring WebSocket

Spring WebSocket是Spring框架提供的一種集成WebSocket的解決方案。它結(jié)合了Spring的依賴注入和消息驅(qū)動的處理方式,能夠輕松地實現(xiàn)WebSocket服務(wù)器端和客戶端通信。Spring WebSocket與STOMP協(xié)議結(jié)合使用,使得消息推送和事件通知變得更加簡單和強(qiáng)大。

配置WebSocket

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").withSockJS(); // 創(chuàng)建WebSocket端點(diǎn),使用SockJS進(jìn)行降級處理
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); // 啟用一個簡單的內(nèi)存消息代理,處理`/topic`下的消息
        registry.setApplicationDestinationPrefixes("/app"); // 設(shè)置消息前綴
    }
}

代碼解析:

  • @EnableWebSocketMessageBroker:啟用WebSocket消息代理,允許使用STOMP協(xié)議進(jìn)行消息推送。
  • registerStompEndpoints:注冊WebSocket端點(diǎn),客戶端通過/chat連接。
  • configureMessageBroker:配置消息代理和應(yīng)用消息前綴。/topic用于廣播消息,/app是應(yīng)用消息的前綴。

發(fā)送和接收消息

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
@Controller
public class ChatController {
    @MessageMapping("/sendMessage") // 處理客戶端發(fā)送的消息
    @SendTo("/topic/messages") // 向訂閱者發(fā)送消息
    public String sendMessage(String message) {
        return "Message: " + message;
    }
}

代碼解析:

  • @MessageMapping(“/sendMessage”):接收客戶端發(fā)送到/sendMessage的消息。
  • @SendTo(“/topic/messages”):消息將被轉(zhuǎn)發(fā)到/topic/messages,然后廣播到所有訂閱者。

客戶端實現(xiàn)

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.1/sockjs.min.js"></script>
</head>
<body>
    <div id="messages"></div>
    <input type="text" id="messageInput">
    <button onclick="sendMessage()">Send</button>
    <script>
        var socket = new SockJS('/chat');
        var stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            stompClient.subscribe('/topic/messages', function(message) {
                document.getElementById("messages").innerHTML += message.body + "
";
            });
        });
        function sendMessage() {
            var message = document.getElementById("messageInput").value;
            stompClient.send("/app/sendMessage", {}, message);
        }
    </script>
</body>
</html>

代碼解析:

  • SockJS:提供WebSocket連接的降級支持,在不支持WebSocket的環(huán)境中使用。
  • STOMP:消息傳遞協(xié)議,客戶端通過STOMP協(xié)議發(fā)送消息到/app/sendMessage,并接收來自/topic/messages的廣播消息。

三、應(yīng)用場景:即時聊天、實時通知、在線游戲

3.1 即時聊天

WebSocket在即時通訊應(yīng)用中的應(yīng)用非常廣泛,利用WebSocket的全雙工通信,可以實現(xiàn)實時的消息推送。每當(dāng)一個用戶發(fā)送消息,消息便立即傳遞給其他連接的客戶端,提供實時互動的體驗。

3.2 實時通知

WebSocket也常用于實時通知系統(tǒng)。在很多業(yè)務(wù)場景中,系統(tǒng)需要向用戶推送實時信息,如訂單狀態(tài)更新、系統(tǒng)警告、直播通知等。WebSocket提供了一個持久連接,能夠在有新事件發(fā)生時立即通知到客戶端。

3.3 在線游戲

在線游戲中的實時數(shù)據(jù)交換對低延遲的要求非常高。WebSocket的低延遲和持久連接特性使其成為在線多人游戲的理想選擇。游戲中的實時互動、玩家狀態(tài)更新、多人協(xié)作等都可以通過WebSocket實現(xiàn)。

四、總結(jié)

Java中的WebSocket和實時通信技術(shù)提供了低延遲、高吞吐量的雙向通信解決方案,使得開發(fā)者能夠輕松地構(gòu)建實時交互應(yīng)用。Java API for WebSocket(JSR 356)Spring WebSocket為開發(fā)者提供了簡潔且功能強(qiáng)大的實現(xiàn)方式,適用于即時聊天、實時通知、在線游戲等多種應(yīng)用場景。

通過WebSocket,開發(fā)者能夠?qū)崿F(xiàn)高效的實時通信,消除了傳統(tǒng)HTTP協(xié)議的限制,使得應(yīng)用能夠在客戶端和服務(wù)器之間進(jìn)行無縫的、實時的雙向數(shù)據(jù)流。隨著WebSocket的廣泛應(yīng)用,實時交互功能在Web開發(fā)中的重要性也將不斷增強(qiáng),推動互聯(lián)網(wǎng)應(yīng)用的智能化與實時化。

到此這篇關(guān)于Java中的WebSocket與實時通信!的文章就介紹到這了,更多相關(guān)Java WebSocket實時通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?Web?Axios實現(xiàn)前后端數(shù)據(jù)異步交互實例代碼

    Java?Web?Axios實現(xiàn)前后端數(shù)據(jù)異步交互實例代碼

    Axios作為一個流行的前端?HTTP?通信庫,可以極大地簡化前端與后端之間的數(shù)據(jù)交互,這篇文章主要介紹了Java?Web?Axios實現(xiàn)前后端數(shù)據(jù)異步交互的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • java實現(xiàn)的正則工具類

    java實現(xiàn)的正則工具類

    這篇文章主要介紹了java實現(xiàn)的正則工具類,可用于針對電話號碼、郵箱、QQ號碼、QQ密碼、手機(jī)號的正則驗證功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • mybatis 有時update語句執(zhí)行無效的解決方案

    mybatis 有時update語句執(zhí)行無效的解決方案

    這篇文章主要介紹了在項目里mybatis有時update語句執(zhí)行無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • MyBatis Generate的使用及說明

    MyBatis Generate的使用及說明

    MyBatisGenerate是一個插件,可幫助你根據(jù)數(shù)據(jù)庫表生成JavaBean、mapper接口及配置文件,使用時需導(dǎo)入依賴、創(chuàng)建配置文件,配置后,通過設(shè)置targetRuntime生成文件,其中JavaBean會自動生成Example類,提供增刪改查功能
    2026-05-05
  • 詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景

    詳解Java中布隆過濾器(Bloom Filter)原理及其使用場景

    布隆過濾器是1970年由布隆提出的,它實際上是一個很長的二進(jìn)制向量和一系列隨機(jī)映射函數(shù),它的作用是檢索一個元素是否存在我們的集合之中,本文給大家詳細(xì)的講解一下布隆過濾器,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • Java線程數(shù)究竟設(shè)多少合理

    Java線程數(shù)究竟設(shè)多少合理

    這篇文章主要介紹了Java線程數(shù)究竟設(shè)多少合理,對線程感興趣的同學(xué),可以參考下
    2021-04-04
  • IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn)

    IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn)

    這篇文章主要介紹了IDEA Spring Boot 自動化構(gòu)建+部署的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Mybatis使用命令生成逆向工程的方法

    Mybatis使用命令生成逆向工程的方法

    這篇文章主要介紹了Mybatis使用命令生成逆向工程的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • spring boot+mybatis搭建一個后端restfull服務(wù)的實例詳解

    spring boot+mybatis搭建一個后端restfull服務(wù)的實例詳解

    這篇文章主要介紹了spring boot+mybatis搭建一個后端restfull服務(wù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Mybatis和其他主流框架的整合使用過程詳解

    Mybatis和其他主流框架的整合使用過程詳解

    MyBatis最初是Apache的一個開源項目iBatis,?2010年6月這個項目由Apache?Software?Foundation遷移到了Google?Code,這篇文章主要介紹了Mybatis和其他主流框架的整合使用,需要的朋友可以參考下
    2023-11-11

最新評論

三亚市| 巴林右旗| 伊金霍洛旗| 伊通| 岑溪市| 平果县| 西平县| 维西| 福海县| 江陵县| 溆浦县| 武功县| 介休市| 麻栗坡县| 明光市| 遵义市| 海淀区| 金川县| 安西县| 永靖县| 扶绥县| 汉寿县| 双桥区| 会同县| 昭苏县| 宾阳县| 宿松县| 张掖市| 正安县| 滦平县| 扶风县| 金坛市| 正阳县| 克拉玛依市| 库尔勒市| 霞浦县| 许昌市| 忻州市| 金堂县| 哈密市| 扶绥县|