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

node.js實(shí)現(xiàn)websocket的即時(shí)通訊詳解

 更新時(shí)間:2023年05月17日 08:29:18   作者:前端小白在前進(jìn)  
這篇文章主要介紹了深入淺出講解websocket的即時(shí)通訊,服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,是真正的雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種,需要的朋友可以參考下

前言

websocket,WebSocket并不是全新的協(xié)議,而是利用了HTTP協(xié)議來(lái)建立連接,接下來(lái)讓我們正式走進(jìn)websocket的大門(mén)!

為什么需要 WebSocket?

初次接觸 WebSocket ,大家都會(huì)問(wèn)同樣的問(wèn)題:我們已經(jīng)有了 HTTP 協(xié)議,為什么還需要另一個(gè)協(xié)議?它能帶來(lái)什么好處? 答案很簡(jiǎn)單,因?yàn)?HTTP 協(xié)議有一個(gè)缺陷:通信只能由客戶端發(fā)起。 舉例來(lái)說(shuō),我們想了解今天的天氣,只能是客戶端服務(wù)器發(fā)出請(qǐng)求,服務(wù)器返回查詢結(jié)果。HTTP 協(xié)議做不到服務(wù)器主動(dòng)向客戶端推送信息。

這種單向請(qǐng)求的特點(diǎn),注定了如果服務(wù)器有連續(xù)的狀態(tài)變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時(shí)候,就發(fā)出一個(gè)詢問(wèn),了解服務(wù)器有沒(méi)有新的信息。最典型的場(chǎng)景就是聊天室。

輪詢的效率低,非常浪費(fèi)資源(因?yàn)楸仨毑煌_B接,或者 HTTP 連接始終打開(kāi))。因此,工程師們一直在思考,有沒(méi)有更好的方法。WebSocket 就是這樣發(fā)明的。

WebSocket簡(jiǎn)介

服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息,是真正的雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種。

為什么WebSocket連接可以實(shí)現(xiàn)全雙工通信而HTTP連接不行呢?實(shí)際上HTTP協(xié)議是建立在TCP協(xié)議之上的,TCP協(xié)議本身就實(shí)現(xiàn)了全雙工通信,但是HTTP協(xié)議的請(qǐng)求-應(yīng)答機(jī)制限制了全雙工通信。WebSocket連接建立以后,其實(shí)只是簡(jiǎn)單規(guī)定了一下:接下來(lái),咱們通信就不使用HTTP協(xié)議了,直接互相發(fā)數(shù)據(jù)吧

注意:WebSocket連接必須由瀏覽器發(fā)起,因?yàn)檎?qǐng)求協(xié)議是一個(gè)標(biāo)準(zhǔn)的HTTP請(qǐng)求

Websocket的特點(diǎn) 建立在 TCP 協(xié)議之上,服務(wù)器端的實(shí)現(xiàn)比較容易。與 HTTP 協(xié)議有著良好的兼容性。默認(rèn)端口也是80和443,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽,能通過(guò)各種 HTTP 代理服務(wù)器。數(shù)據(jù)格式比較輕量,性能開(kāi)銷小,通信高效??梢?code>發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)。沒(méi)有同源限制,客戶端可以與任意服務(wù)器通信。協(xié)議標(biāo)識(shí)符是ws(如果加密,則為wss),服務(wù)器網(wǎng)址就是 URL(例如:ws://localhost:8080)。

在這里插入圖片描述

WebSocket的應(yīng)用場(chǎng)景

  • 彈幕
  • 媒體聊天
  • 協(xié)同編輯(我們常用的在線編輯)
  • 基于位置的應(yīng)用(例如:美團(tuán)外賣(mài)中我們可以實(shí)時(shí)查看外賣(mài)小哥的位置,距離目的地的距離)
  • 體育實(shí)況更新(騰訊體育nba直播技術(shù)統(tǒng)計(jì)的數(shù)據(jù)實(shí)時(shí)更新)
  • 股票基金報(bào)價(jià)實(shí)時(shí)更新

服務(wù)器支持

由于WebSocket是一個(gè)協(xié)議,服務(wù)器具體怎么實(shí)現(xiàn),取決于所用編程語(yǔ)言和框架本身。Node.js本身支持的協(xié)議包括TCP協(xié)議HTTP協(xié)議,要支持WebSocket協(xié)議,需要對(duì)Node.js提供的HTTPServer做額外的開(kāi)發(fā)。已經(jīng)有若干基于Node.js的穩(wěn)定可靠的WebSocket實(shí)現(xiàn),我們直接用npm安裝使用即可。

客戶端websocket的 API

WebScoket構(gòu)造函數(shù)

const ws = new WebSocket(`ws://localhost:8080?token=${localStorage.getItem("token")}`)

WebSocket 對(duì)象作為一個(gè)構(gòu)造函數(shù),用于新建 WebSocket 實(shí)例。執(zhí)行上面語(yǔ)句之后,客戶端就會(huì)與服務(wù)器進(jìn)行連接。 注意: 在這里傳入的參數(shù)url中可以攜帶token,可以進(jìn)行登錄鑒權(quán)

ws.onopen()

實(shí)例對(duì)象的onopen屬性,用于指定連接成功后的回調(diào)函數(shù)。

ws.onopen = () => {
       console.log('連接成功!');
}

ws.onclose()

實(shí)例對(duì)象的onclose屬性,用于指定連接關(guān)閉后的回調(diào)函數(shù)。

ws.onclose = () => {
       console.log('關(guān)閉成功!')
}

ws.onmessage()

實(shí)例對(duì)象的onmessage屬性,用于指定收到服務(wù)器數(shù)據(jù)后的回調(diào)函數(shù)。

ws.onmessage = (msgObj) => {
	//...在這里進(jìn)行邏輯操作
}

注意:這里的形參是服務(wù)器傳來(lái)的數(shù)據(jù)對(duì)象,msgObj.data可以訪問(wèn)到服務(wù)端返回的具體信息數(shù)據(jù)

ws.send()

實(shí)例對(duì)象的send()方法用于向服務(wù)器發(fā)送數(shù)據(jù)。

ws.send('hello websocket')

node中使用WebSocket

客戶端使用

var ws = new WebSocket(`ws://localhost:8080?token=${localStorage.getItem("token")}`)
ws.onopen = () => {
      console.log("open")
      ws.send(JSON.stringify({
        type: WebSocketType.GroupList
      }))
    }
ws.onmessage = (evt) => {
    console.log(evt.data)
}

在上面我們對(duì)客戶端的方法做了一個(gè)了解后,將對(duì)服務(wù)端進(jìn)行了解!=>node中使用websocket官網(wǎng)

安裝ws模塊

npm install ws

node中簡(jiǎn)單使用

const  WebSocket = require("ws")
const WebSocketServer = WebSocket.WebSocketServer
//創(chuàng)建websocket服務(wù),端口號(hào)為8080,與客戶端請(qǐng)求的端口號(hào)保持一致
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
// connection,表示連接客戶端,形參中的ws代表我們的客戶端
    ws.on('message', function message(data, isBinary) {
    //這里表示只要ws標(biāo)記的客戶端給我們發(fā)送消息,我們通過(guò)監(jiān)聽(tīng)message可以得到前臺(tái)發(fā)過(guò)來(lái)的消息
        wss.clients.forEach(function each(client) {
        //wss.clients存放著連接到我們服務(wù)器所有的客戶端,通過(guò)遍歷,將客戶端的消息轉(zhuǎn)發(fā)給其他客戶端,從而實(shí)現(xiàn)群聊
            if (client !== ws && client.readyState === WebSocket.OPEN) {
            //這里client!==ws 目的是群發(fā)的時(shí)候不給自己發(fā)消息
                client.send(data, { binary: false });
                //在這里binary:false表示返回的數(shù)據(jù)不是二進(jìn)制類型!
            }
        });
    });
    ws.send('歡迎加入聊天室');  //給客戶端返回信息
});

注意:上述代碼中ws實(shí)質(zhì)上是一個(gè)句柄,(按照我的理解就是:ws代表我們打開(kāi)的瀏覽器窗口,每打開(kāi)一個(gè)窗口,ws就代表不同的窗口,代表不同的客戶端),用來(lái)指示服務(wù)端指向客戶端的唯一標(biāo)識(shí)

小結(jié)

WebScoket整體來(lái)說(shuō)的話不是很難,只是比較繁瑣罷了,前后端必須要進(jìn)行一對(duì)一的匹配,也就是說(shuō),有來(lái)就有回,本篇為wensocket學(xué)習(xí)的第一階段而已,后面的文章將會(huì)切入到群聊、私聊的demo

到此這篇關(guān)于深入淺出講解websocket的即時(shí)通訊的文章就介紹到這了,更多相關(guān)websocket即時(shí)通訊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • node.js 利用流實(shí)現(xiàn)讀寫(xiě)同步,邊讀邊寫(xiě)的方法

    node.js 利用流實(shí)現(xiàn)讀寫(xiě)同步,邊讀邊寫(xiě)的方法

    下面小編就為大家?guī)?lái)一篇node.js 利用流實(shí)現(xiàn)讀寫(xiě)同步,邊讀邊寫(xiě)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • node.JS md5加密中文與php結(jié)果不一致的解決方法

    node.JS md5加密中文與php結(jié)果不一致的解決方法

    本篇文章主要介紹了node.JS md5加密中文與php結(jié)果不一致的解決方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-05-05
  • Windows系統(tǒng)中安裝nodejs圖文教程

    Windows系統(tǒng)中安裝nodejs圖文教程

    這篇文章主要介紹了Windows系統(tǒng)中安裝nodejs圖文教程,本文分解了安裝中的各個(gè)步驟并給出圖文說(shuō)明,需要的朋友可以參考下
    2015-02-02
  • 在node.js中讀寫(xiě)文件的三種方法總結(jié)

    在node.js中讀寫(xiě)文件的三種方法總結(jié)

    nodejs中所有與文件相關(guān)的操作都在fs模塊中,而讀寫(xiě)操作又是我們會(huì)經(jīng)常用到的操作,nodejs的fs模塊針對(duì)讀操作為我們提供了readFile,read, createReadStream三個(gè)方法,接下來(lái)小編就和大家一起來(lái)分析一下這三種方法
    2023-09-09
  • nodejs 生成和導(dǎo)出 word的實(shí)例代碼

    nodejs 生成和導(dǎo)出 word的實(shí)例代碼

    前段時(shí)間由于項(xiàng)目需求,得做excel和word的導(dǎo)出功能.這篇文章主要介紹了nodejs 生成和導(dǎo)出 word的實(shí)例代碼,需要的朋友可以參考下
    2018-07-07
  • 如何設(shè)置process.env.NODE_ENV生產(chǎn)環(huán)境模式

    如何設(shè)置process.env.NODE_ENV生產(chǎn)環(huán)境模式

    process.env.NODE_ENV默認(rèn)只有兩種狀態(tài)即development和production,本文主要介紹了process.env.NODE_ENV設(shè)置生產(chǎn)環(huán)境模式,感興趣的可以了解一下
    2021-09-09
  • Express作者TJ告別Node.js奔向Go

    Express作者TJ告別Node.js奔向Go

    TJ自我介紹: TJ Holowaychuk ,程序員兼藝術(shù)家,Koa、Co、Express、jade、mocha、node-canvas、commander.js等知名開(kāi)源項(xiàng)目的創(chuàng)建和貢獻(xiàn)者。
    2014-07-07
  • Node.js+Express配置入門(mén)教程詳解

    Node.js+Express配置入門(mén)教程詳解

    下面小編就為大家?guī)?lái)一篇Node.js+Express配置入門(mén)教程詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • 如何用node.js作為后臺(tái),讀寫(xiě)xml文件,Node.js的文件系統(tǒng)的Api

    如何用node.js作為后臺(tái),讀寫(xiě)xml文件,Node.js的文件系統(tǒng)的Api

    這篇文章主要介紹了如何用node.js作為后臺(tái),讀寫(xiě)xml文件,Node.js的文件系統(tǒng)的Api,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Node.js從字符串生成文件流的實(shí)現(xiàn)方法

    Node.js從字符串生成文件流的實(shí)現(xiàn)方法

    這篇文章主要介紹了Node.js從字符串生成文件流的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

玉林市| 山阴县| 兴城市| 武宣县| 潞西市| 登封市| 交口县| 德阳市| 屏南县| 平凉市| 漳州市| 武山县| 汶川县| 大埔区| 勃利县| 休宁县| 隆昌县| 铜梁县| 刚察县| 锡林郭勒盟| 应用必备| 屏边| 武义县| 师宗县| 临沧市| 新乡市| 岳阳市| 宜兰市| 马公市| 方山县| 吐鲁番市| 杭锦旗| 威远县| 开平市| 余庆县| 东安县| 丹寨县| 普洱| 信宜市| 静海县| 封开县|