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

WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議

這篇具有很好參考價值的文章主要介紹了WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

???作者介紹:雙非本科大三網(wǎng)絡(luò)工程專業(yè)在讀,阿里云專家博主,專注于Java領(lǐng)域?qū)W習(xí),擅長web應(yīng)用開發(fā)、數(shù)據(jù)結(jié)構(gòu)和算法,初步涉獵Python人工智能開發(fā)和前端開發(fā)。
??主頁:@逐夢蒼穹
??所屬專欄:Java EE
? 您的一鍵三連,是我創(chuàng)作的最大動力??

1、介紹

WebSocket 是基于 TCP 的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信——瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接, 并進(jìn)行雙向數(shù)據(jù)傳輸。
HTTP協(xié)議和WebSocket協(xié)議對比:

  • HTTP是短連接,WebSocket是長連接
  • HTTP通信是單向的,基于請求響應(yīng)模式;WebSocket支持雙向通信
  • HTTP和WebSocket底層都是TCP連接
    WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議,JavaEE,網(wǎng)絡(luò)協(xié)議,websocket,tcp/ip

**思考:**既然WebSocket支持雙向通信,功能看似比HTTP強(qiáng)大,那么我們是不是可以基于WebSocket開發(fā)所有的業(yè)務(wù)功能?

WebSocket缺點(diǎn):

服務(wù)器長期維護(hù)長連接需要一定的成本
各個瀏覽器支持程度不一
WebSocket 是長連接,受網(wǎng)絡(luò)限制比較大,需要處理好重連

結(jié)論: WebSocket并不能完全取代HTTP,它只適合在特定的場景下使用

WebSocket應(yīng)用場景:

1). 視頻彈幕
2). 網(wǎng)頁聊天
3). 體育實(shí)況更新
4). 股票基金報價實(shí)時更新

2、示例

2.1、分析

**需求:**實(shí)現(xiàn)瀏覽器與服務(wù)器全雙工通信。瀏覽器既可以向服務(wù)器發(fā)送消息,服務(wù)器也可主動向?yàn)g覽器推送消息。
效果展示:
WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議,JavaEE,網(wǎng)絡(luò)協(xié)議,websocket,tcp/ip

實(shí)現(xiàn)步驟:

1). 直接使用websocket.html頁面作為WebSocket客戶端
2). 導(dǎo)入WebSocket的maven坐標(biāo)
3). 導(dǎo)入WebSocket服務(wù)端組件WebSocketServer,用于和客戶端通信
4). 導(dǎo)入配置類WebSocketConfiguration,注冊WebSocket的服務(wù)端組件
5). 導(dǎo)入定時任務(wù)類WebSocketTask,定時向客戶端推送數(shù)據(jù)

2.2、代碼開發(fā)

1). 定義websocket.html頁面

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
    <input id="text" type="text" />
    <button onclick="send()">發(fā)送消息</button>
    <button onclick="closeWebSocket()">關(guān)閉連接</button>
    <div id="message">
    </div>
</body>
<script type="text/javascript">
    var websocket = null;
    var clientId = Math.random().toString(36).substr(2);

    //判斷當(dāng)前瀏覽器是否支持WebSocket
    if('WebSocket' in window){
        //連接WebSocket節(jié)點(diǎn)
        websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);
    }
    else{
        alert('Not support websocket')
    }

    //連接發(fā)生錯誤的回調(diào)方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //連接成功建立的回調(diào)方法
    websocket.onopen = function(){
        setMessageInnerHTML("連接成功");
    }

    //接收到消息的回調(diào)方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    //連接關(guān)閉的回調(diào)方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    }

    //監(jiān)聽窗口關(guān)閉事件,當(dāng)窗口關(guān)閉時,主動去關(guān)閉websocket連接,防止連接還沒斷開就關(guān)閉窗口,server端會拋異常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //將消息顯示在網(wǎng)頁上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //發(fā)送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
	
	//關(guān)閉連接
    function closeWebSocket() {
        websocket.close();
    }
</script>
</html>

2). 導(dǎo)入maven坐標(biāo)

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

3). 定義WebSocket服務(wù)端組件

package com.sky.websocket;

import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket服務(wù)
 */
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放會話對象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 連接建立成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客戶端:" + sid + "建立連接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message 客戶端發(fā)送過來的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到來自客戶端:" + sid + "的信息:" + message);
    }

    /**
     * 連接關(guān)閉調(diào)用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("連接斷開:" + sid);
        sessionMap.remove(sid);
    }

    /**
     * 群發(fā)
     *
     * @param message
     */
    public void sendToAllClient(String message) {
        Collection<Session> sessions = sessionMap.values();
        for (Session session : sessions) {
            try {
                //服務(wù)器向客戶端發(fā)送消息
                session.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

4). 定義配置類,注冊WebSocket的服務(wù)端組件

package com.sky.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置類,用于注冊WebSocket的Bean
 */
@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

}

5). 定義定時任務(wù)類,定時向客戶端推送數(shù)據(jù)

package com.sky.task;

import com.sky.websocket.WebSocketServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class WebSocketTask {
    @Autowired
    private WebSocketServer webSocketServer;

    /**
     * 通過WebSocket每隔5秒向客戶端發(fā)送消息
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void sendMessageToClient() {
        webSocketServer.sendToAllClient("這是來自服務(wù)端的消息:" + DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
    }
}

2.3、功能測試

啟動服務(wù),打開websocket.html頁面
瀏覽器向服務(wù)器發(fā)送數(shù)據(jù):
WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議,JavaEE,網(wǎng)絡(luò)協(xié)議,websocket,tcp/ip

服務(wù)器向?yàn)g覽器間隔5秒推送數(shù)據(jù):
WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議,JavaEE,網(wǎng)絡(luò)協(xié)議,websocket,tcp/ip文章來源地址http://www.zghlxwxcb.cn/news/detail-826723.html

到了這里,關(guān)于WebSocket | 基于TCP的全雙工通信網(wǎng)絡(luò)協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 網(wǎng)絡(luò)編程day2——基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信

    ? ? ? ? 計(jì)算機(jī)S ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????計(jì)算機(jī)C ? ? ?創(chuàng)建socket對象 ? ? ? ? ? ? ? ? ????????????????? 創(chuàng)建socket對象 ? ? ?準(zhǔn)備通信地址(自己的ip(非公網(wǎng)ip))? ? ? 準(zhǔn)備通信地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (計(jì)算

    2024年02月10日
    瀏覽(40)
  • QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    QT C++ 基于TCP通信的網(wǎng)絡(luò)聊天室

    .ui .pro 在pro文件中添加network庫 .h .main .cpp .ui .pro 在pro文件中添加network庫 .h .main .cpp ? ? ? ?

    2024年02月09日
    瀏覽(23)
  • 【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    TCP服務(wù)器與客戶端的搭建需要借助以下API ServerSocket 是創(chuàng)建TCP服務(wù)端Socket的API。 ServerSocket 構(gòu)造方法 : 方法簽名 方法說明 ServerSocket(int port) 創(chuàng)建一個服務(wù)端流套接字Socket,并綁定到指定端口 ServerSocket 方法: 方法簽名 方法說明 Socket accept() 開始監(jiān)聽指定端口(創(chuàng)建時綁定的端

    2024年03月12日
    瀏覽(34)
  • Qt網(wǎng)絡(luò)與通信(Websocket服務(wù))

    目錄 WebSocket理論知識 Websocket服務(wù)器 頁面設(shè)計(jì) 框架設(shè)計(jì) 服務(wù)監(jiān)聽

    2023年04月19日
    瀏覽(21)
  • Java中網(wǎng)絡(luò)的基本介紹。網(wǎng)絡(luò)通信,網(wǎng)絡(luò),ip地址,域名,端口,網(wǎng)絡(luò)通信協(xié)議,TCP/IP傳輸過程,網(wǎng)絡(luò)通信協(xié)議模型,TCP協(xié)議,UDP協(xié)議

    Java中網(wǎng)絡(luò)的基本介紹。網(wǎng)絡(luò)通信,網(wǎng)絡(luò),ip地址,域名,端口,網(wǎng)絡(luò)通信協(xié)議,TCP/IP傳輸過程,網(wǎng)絡(luò)通信協(xié)議模型,TCP協(xié)議,UDP協(xié)議

    - 網(wǎng)絡(luò)通信 概念:網(wǎng)絡(luò)通信是指 通過計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行信息傳輸?shù)倪^程 ,包括數(shù)據(jù)傳輸、語音通話、視頻會議等。在網(wǎng)絡(luò)通信中,數(shù)據(jù)被分成一系列的數(shù)據(jù)包,并通過網(wǎng)絡(luò)傳輸?shù)侥康牡?。在?shù)據(jù)傳輸過程中,需要確保數(shù)據(jù)的完整性、準(zhǔn)確性和安全性。常見的網(wǎng)絡(luò)通信協(xié)議有T

    2024年02月10日
    瀏覽(33)
  • QT網(wǎng)絡(luò)通信-TCP、UDP通信

    時間記錄:2024/1/17 pro文件添加模塊network (1)創(chuàng)建TCP服務(wù)器對象 QTcpServer (2)為 QTcpServer 對象的 newConnection 信號綁定槽,用來監(jiān)聽TCP客戶端的新連接,有新的客戶端連接便會觸發(fā)此信號 (3)使用 nextPendingConnection 方法獲取連接的Tcp客戶端對象 QTcpSocket (4)為 QTcpSocket 的 r

    2024年01月18日
    瀏覽(30)
  • 持久雙向通信網(wǎng)絡(luò)協(xié)議-WebSocket-入門案例實(shí)現(xiàn)demo

    持久雙向通信網(wǎng)絡(luò)協(xié)議-WebSocket-入門案例實(shí)現(xiàn)demo

    1 介紹 WebSocket 是基于 TCP 的一種新的 網(wǎng)絡(luò)協(xié)議 。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信——瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建 持久性 的連接, 并進(jìn)行 雙向 數(shù)據(jù)傳輸。 HTTP協(xié)議和WebSocket協(xié)議對比: HTTP是 短連接 (一次響應(yīng)完即消除) WebSocket是 長連接

    2024年01月16日
    瀏覽(22)
  • Linux——網(wǎng)絡(luò)通信TCP通信常用的接口和tcp服務(wù)demo

    Linux——網(wǎng)絡(luò)通信TCP通信常用的接口和tcp服務(wù)demo

    socket()函數(shù)主要作用是返回一個描述符,他的作用就是打開一個網(wǎng)絡(luò)通訊端口,返回的這個描述符其實(shí)就可以理解為一個文件描述符,tcp在通訊的時候是會開辟一個緩存空間的,我們發(fā)送和讀取消息可以理解為在這個緩存空間中進(jìn)行的。因此這里我們可以知道我們可以直接用

    2024年02月21日
    瀏覽(17)
  • 【網(wǎng)絡(luò)】socket——TCP網(wǎng)絡(luò)通信 | 日志功能 | 守護(hù)進(jìn)程

    【網(wǎng)絡(luò)】socket——TCP網(wǎng)絡(luò)通信 | 日志功能 | 守護(hù)進(jìn)程

    ??作者:一只大喵咪1201 ??專欄:《網(wǎng)絡(luò)》 ??格言: 你只管努力,剩下的交給時間! 上篇文章中本喵介紹了UDP網(wǎng)絡(luò)通信的socket代碼,今天介紹TCP網(wǎng)絡(luò)通信的socket代碼。 和 udp 的網(wǎng)絡(luò)通信一樣, tcp 通信也需要服務(wù)器指定端口號,IP地址同樣使用 0.0.0.0 ,以便客戶端所有對服

    2024年02月16日
    瀏覽(24)
  • Java網(wǎng)絡(luò)編程 - TCP通信

    Java網(wǎng)絡(luò)編程 - TCP通信

    快速入門(一發(fā)一收) TCP協(xié)議回顧 : TCP是一種面向連接,安全、可靠的傳輸數(shù)據(jù)的協(xié)議 傳輸前,采用“三次握手”方式,點(diǎn)對點(diǎn)通信,是可靠的 在連接中可進(jìn)行大數(shù)據(jù)量的傳輸 TCP通信模式 : 在java中只要是使用java.net.Socket類實(shí)現(xiàn)通信,底層即是使用了TCP協(xié)議 編寫客戶端代碼

    2024年01月19日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包