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

Node.js實現(xiàn)WebSocket

這篇具有很好參考價值的文章主要介紹了Node.js實現(xiàn)WebSocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、WebSocket出現(xiàn)的原因

1、Http協(xié)議發(fā)布REST API 的不足:

每次請求響應(yīng)完成之后,服務(wù)器與客戶端之間的連接就斷開了,如果客戶端想要繼續(xù)獲取服務(wù)器的消息,必須再次向服務(wù)器發(fā)起請

求。這顯然無法適應(yīng)對實時通信有高要求的場景。

2、改善http的不足:Web通信領(lǐng)域出現(xiàn)了一些其他的解決方案,如輪詢、長輪詢、服務(wù)器推送事件、WebSocket

(1)輪詢:就是重復(fù)發(fā)送新的請求到服務(wù)器。如果服務(wù)器沒有新的數(shù)據(jù),就發(fā)送適當?shù)闹甘静㈥P(guān)閉連接。然后客戶端等待一段時間

(比如間隔一秒),再發(fā)送另一個請求。這種實現(xiàn)方式相對比較簡單,無須做過多的更改。但缺點是輪詢的間隔過長,會導(dǎo)致用戶不能及

時接收到更新的數(shù)據(jù);輪詢時間過短,會導(dǎo)致查詢請求過多,增加服務(wù)器端的負擔。

(2)長輪詢:客戶端發(fā)送一個請求到服務(wù)器,如果服務(wù)器端沒有新的數(shù)據(jù),就保持這個連接直到有數(shù)據(jù)。一旦服務(wù)器端有了數(shù)據(jù)

(消息)給客戶端,它就使用這個連接發(fā)送數(shù)據(jù)給客戶端,接著連接關(guān)閉

(3)服務(wù)器推送事件:Server-Sent Events(SSE),SSE通常重用一個連接處理多個消息(事件)。SSE還定義了一個專門的媒體類

型,用于描述一個從服務(wù)端發(fā)送到客戶端的簡單格式。

(4)WebSocket:提供了一個真正的全雙工連接。發(fā)起者是一個客戶端,發(fā)送一個帶特殊HTTP頭的請求到服務(wù)端,通知服務(wù)器。

該方案的優(yōu)點是屬于html5標準,已經(jīng)被大多數(shù)瀏覽器支持,而且是真正的全雙工,性能比較好,其缺點是實現(xiàn)起來比較復(fù)雜,需要對ws

協(xié)議專門處理。

二、Node使用ws創(chuàng)建WebSocket服務(wù)器

1、Node.js原生API沒有提供對WebSocket的支持,需要安裝第三方包才能使用WebSocket功能

2、ws模塊:是一個用于支持WebSocket客戶端和服務(wù)器的框架。它易于使用,功能強大,且不依賴于其他環(huán)境

3、安裝ws:npm install ws

4、創(chuàng)建WebSocket服務(wù)器:

?//創(chuàng)建一個WebSocket服務(wù)器,在8080端口啟動
?const WebSocket = require('ws')
?const server = new WebSocket.Server({port:8080})

5、WebSocket.Server(options[,callback])方法中options對象所支持的參數(shù)

(1)host:綁定服務(wù)器的主機名

(2)port:綁定服務(wù)器的端口號

(3)backlog:掛起連接隊列的最大長度

(4)server:預(yù)先創(chuàng)建的node.js http/s服務(wù)器

(5)verifyClient:可用于驗證傳入連接的函數(shù)

(6)handleProtocols:可用于處理WebSocket子協(xié)議的函數(shù)

(7)path:僅接受與此路徑匹配的連接

(8)noServer:不啟用服務(wù)器模式

(9)clientTracking:指定是否跟蹤客戶端

(10)perMessageDeflate:啟用/禁用消息壓縮

(11)maxPayload:允許的最大消息大?。ㄒ宰止?jié)為單位)

三、監(jiān)聽連接:ws通過connection事件來監(jiān)聽連接

server.on('connection',function connection(ws,req){
? ? ?const ip = req.socket.remoteAddress
? ? ?const port = req.socket.remotePort
? ? ?const clientName = ip + port
??
? ? ?console.log('%s is connected ',clientName)
?})
?//只要有WebSocket連接到該服務(wù)器,就會觸發(fā)'connection'事件;req對象可以用來獲取客戶端的信息,如ip、端口號
?//獲取所有已連接的客戶端信息,則可以使用server.clients數(shù)據(jù)集

四、發(fā)送數(shù)據(jù):ws通過send()方法來發(fā)送數(shù)據(jù)

?/* send(data [,options][,callback])
? ? ?  data:發(fā)送的數(shù)據(jù)
? ? ?  options對象:
? ? ? ?  (1)compress:指定數(shù)據(jù)是否需要壓縮。默認為true
? ? ? ?  (2)binary:指定數(shù)據(jù)是否通過二進制傳送。默認是自動檢測
? ? ? ?  (3)mask:指定是否應(yīng)遮罩數(shù)據(jù)。
? ? ? ?  (4)fin:指定數(shù)據(jù)是否為消息的最后一個片段。默認為true
?*/
?server.on('connection',function connection(ws,req){
? ? ?const ip = req.socket.remoteAddress
? ? ?const port = req.socket.remotePort
? ? ?const clientName = ip + port
??
? ? ?console.log('%s is connected ',clientName)
??
? ? ?ws.send('Welcome ' + clientName)
?})

五、接收數(shù)據(jù):ws通過message事件來接收數(shù)據(jù)。當客戶端有消息發(fā)送給服務(wù)器時,服務(wù)器就能夠觸發(fā)該消息

server.on('connection',function connection(ws,req){
? ? ?const ip = req.socket.remoteAddress
? ? ?const port = req.socket.remotePort
? ? ?const clientName = ip + port
??
? ? ?console.log('%s is connected ',clientName)
??
? ? ?ws.send('Welcome ' + clientName)
??
? ? ?ws.on('message',function incoming(message){
? ? ? ? ?console.log('received: %s from %s',message,clientName)
? ? ? ? ?server.clients.forEach(function each(client){
? ? ? ? ? ? ?if(client.readyState === WebSocket.OPEN){
? ? ? ? ? ? ? ? ?client.send(clientName +" -> " + message)
? ? ? ? ? ?  }
? ? ? ?  })
? ?  })
?})

六、準備的狀態(tài):ws中WebSocket類具有以下4中準備狀態(tài)

1、CONNCETION:值為0,表示連接還沒有打開

2、OPEN:值為1,表示連接已經(jīng)打開,可以通信了

3、CLOSING:值為2,表示連接正在關(guān)閉

4、CLOSED:值為2,表示連接已經(jīng)關(guān)閉

server.clients.forEach(function each(client){
? ? ? ? ? ? ?if(client.readyState === WebSocket.OPEN){
? ? ? ? ? ? ? ? ?client.send(clientName +" -> " + message)
? ? ? ? ? ?  }
?})

七、關(guān)閉WebSocket服務(wù)器:通過監(jiān)聽close事件關(guān)閉服務(wù)器

?server.on('close',function close(){
? ? ?console.log('disconnected')
?})

案例

1、服務(wù)器端:server.js

const WebSocket = require('ws')
??
?const server = new WebSocket.Server({port:8080})
??
?server.on('open',function open(){
? ? ?console.log('connected')
?})
??
?server.on('close',function close(){
? ? ?console.log('disconnected')
?})
??
?server.on('connection',function connection(ws,req){
? ? ?const ip = req.socket.remoteAddress
? ? ?const port = req.socket.remotePort
? ? ?const clientName = ip + port
??
? ? ?console.log('%s is connected ',clientName)
??
? ? ?ws.send('Welcome ' + clientName)
??
? ? ?ws.on('message',function incoming(message){
? ? ? ? ?console.log('received: %s from %s',message,clientName)
? ? ? ? ?server.clients.forEach(function each(client){
? ? ? ? ? ? ?if(client.readyState === WebSocket.OPEN){
? ? ? ? ? ? ? ? ?client.send(clientName +" -> " + message)
? ? ? ? ? ?  }
? ? ? ?  })
? ?  })
?})

2、客戶端:文章來源地址http://www.zghlxwxcb.cn/news/detail-783139.html

<!DOCTYPE html>
?<html lang="en">
?<head>
? ? ?<meta charset="UTF-8">
? ? ?<meta http-equiv="X-UA-Compatible" content="IE=edge">
? ? ?<meta name="viewport" content="width=device-width, initial-scale=1.0">
? ? ?<title>Document</title>
?</head>
?<body>
? ? ?<script>
? ? ? ? ?var socket
? ? ? ? ?if (!window.WebSocket) {
? ? ? ? ? ? ?window.WebSocket = window.MozWebSocket
? ? ? ?  }
? ? ? ? ?if(window.WebSocket){
? ? ? ? ? ? ?socket = new WebSocket("ws://localhost:8080/ws")
? ? ? ? ? ? ?socket.onmessage = function(event){
? ? ? ? ? ? ? ? ?var ta = document.getElementById('responseTest')
? ? ? ? ? ? ? ? ?ta.value = ta.value + '\n' + event.data
? ? ? ? ? ?  }
? ? ? ? ? ? ?socket.onopen = function(event) {
? ? ? ? ? ? ? ? ?var ta = document.getElementById('responseTest')
? ? ? ? ? ? ? ? ?ta.value = '連接開啟!'
? ? ? ? ? ?  }
??
? ? ? ? ? ? ?socket.onclose = function(event) {
? ? ? ? ? ? ? ? ?var ta = document.getElementById('responseTest')
? ? ? ? ? ? ? ? ?ta.value = '連接關(guān)閉!'
? ? ? ? ? ?  }
? ? ? ?  }else{
? ? ? ? ? ? ?alert('你的瀏覽器不支持WebSocket')
? ? ? ?  }
??
? ? ? ? ?function send(message){
? ? ? ? ? ? ?if(!window.WebSocket){
? ? ? ? ? ? ? ? ?return
? ? ? ? ? ?  }
? ? ? ? ? ? ?if(socket.readyState === WebSocket.OPEN){
? ? ? ? ? ? ? ? ?socket.send(message)
? ? ? ? ? ?  }else{
? ? ? ? ? ? ? ? ?alert('連接沒有開啟')
? ? ? ? ? ?  }
? ? ? ?  }
? ? ?</script>
? ? ?<form onsubmit="return false">
? ? ? ? ?<h3>WebSocket 聊天室:</h3>
? ? ? ? ?<textarea ?id="responseTest" style="width: 500px;height: 300px;"></textarea>
? ? ? ? ?<br>
? ? ? ? ?<input type="text" name="message" style="width: 300px;" value="Welcome to woniuxy.com">
? ? ? ? ?<input type="button" value="發(fā)送消息" onclick="send(this.form.message.value)">
? ? ? ? ?<input type="button" value="清空聊天記錄" onclick="javascript:document.getElementById('responseTest').value=''">
? ? ?</form>
?</body>
?</html>

到了這里,關(guān)于Node.js實現(xiàn)WebSocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 如何使用websocket+node.js實現(xiàn)pc后臺與小程序端實時通信

    如何使用websocket+node.js實現(xiàn)pc后臺與小程序端實時通信

    實現(xiàn)功能:實現(xiàn)pc后臺與小程序端互發(fā)通信能夠?qū)崟r檢測到 1.安裝ws依賴 2.創(chuàng)建index.js 3.打開終端,啟動服務(wù) 這里是手動點擊連接按鈕,發(fā)起的websocket連接,可自行更改到其他合適的地方連接websocket 1.創(chuàng)建兩個按鈕,連接按鈕,發(fā)送按鈕 2.定義事件,連接ws

    2024年02月03日
    瀏覽(26)
  • 用 Node.js 手寫 WebSocket 協(xié)議

    用 Node.js 手寫 WebSocket 協(xié)議

    目錄 引言 從 http 到 websocekt 的切換 Sec-WebSocket-Key 與 Sec-WebSocket-Accept 全新的二進制協(xié)議 自己實現(xiàn)一個 websocket 服務(wù)器 按照協(xié)議格式解析收到的Buffer 取出opcode 取出MASK與payload長度 根據(jù)mask key讀取數(shù)據(jù) 根據(jù)類型處理數(shù)據(jù) frame 幀 數(shù)據(jù)的發(fā)送 完整代碼 總結(jié) ????????我們知道,

    2024年02月16日
    瀏覽(19)
  • webSocket 聊天室 node.js 版

    webSocket 聊天室 node.js 版

    全局安裝vue腳手架? npm install @vue/cli -g 創(chuàng)建 vue3 + ts 腳手架? vue create vue3-chatroom src 同級目錄下建 server: ? 核心代碼: 完整代碼:

    2024年02月12日
    瀏覽(21)
  • 使用node實現(xiàn)websocket

    使用node實現(xiàn)websocket

    websocket 代表了 Web 應(yīng)用程序通信方式的根本轉(zhuǎn)變。不同于傳統(tǒng)的 HTTP 請求響應(yīng)周期,即客戶端從服務(wù)器請求數(shù)據(jù)并等待響應(yīng), websocket 在客戶端和服務(wù)器之間建立一個持久的全雙工連接。這意味著一旦建立了 websocket ,數(shù)據(jù)可以在任何時候雙向流動,而不需要重復(fù)請求。 Web

    2024年02月08日
    瀏覽(13)
  • websocket+node實現(xiàn)直播(弱雞版)

    websocket+node實現(xiàn)直播(弱雞版)

    心血歷程 這部分主要是寫在寫這些的時候遇到的問題以及換思路的過程,可以之間看正文 在之前我也寫過直播功能,并且與websocket相結(jié)合實現(xiàn)了直播彈幕。只不過直播是使用的騰訊云的,而不是手寫的直播推流拉流,這次又有一個新的項目,和直播息息相關(guān)(直播自習(xí)平臺

    2024年02月14日
    瀏覽(15)
  • 【websocket】Node+Vue2+WebSocket實現(xiàn)前后端通訊

    【websocket】Node+Vue2+WebSocket實現(xiàn)前后端通訊

    WebSocket是一個長連接,客戶端可以給服務(wù)端發(fā)送消息,服務(wù)端也可以給客戶端發(fā)送消息,是 全雙工通信。 平時的前后端分離項目,是前端請求結(jié)果獲取后端服務(wù)器數(shù)據(jù),從而渲染到頁面,服務(wù)端無法主動向客戶端發(fā)起消息,某些需求場景下,一旦客戶端 需要知道服務(wù)端的頻

    2024年02月02日
    瀏覽(22)
  • websocket實現(xiàn)聊天室(vue2 + node)

    websocket實現(xiàn)聊天室(vue2 + node)

    需求分析如圖: 搭建的項目結(jié)構(gòu)如圖: 前端步驟: vue create socket_demo (創(chuàng)建項目) views下面建立Home , Login組件 路由里面配置路徑 Home組件內(nèi)部開啟websocket連接 前端相關(guān)組件代碼: Login組件 Home組件 router/index.js 后端步驟: 在項目外層創(chuàng)建server文件夾(src目錄同級) npm init -y創(chuàng)建

    2024年01月22日
    瀏覽(101)
  • vue和node使用websocket實現(xiàn)數(shù)據(jù)推送,實時聊天

    vue和node使用websocket實現(xiàn)數(shù)據(jù)推送,實時聊天

    需求:node做后端根據(jù)websocket,連接數(shù)據(jù)庫,數(shù)據(jù)庫的字段改變后,前端不用刷新頁面也能更新到數(shù)據(jù),前端也可以發(fā)送消息給后端,后端接受后把前端消息做處理再推送給前端展示 使用node ./app.js運行項目 在需要使用websocket連接的頁面引入 默認如下: id為243 在數(shù)據(jù)庫改為

    2024年02月15日
    瀏覽(29)
  • WebSocket原生js實現(xiàn)

    WebSocket 是一種網(wǎng)絡(luò)通信協(xié)議。 1. 簡單介紹一下HTTP協(xié)議 ? HTTP 協(xié)議是一種無狀態(tài)的、無連接的、單向的應(yīng)用層協(xié)議。它采用了請求/響應(yīng)模型。 通信請求只能由客戶端發(fā)起,服務(wù)端對請求做出應(yīng)答處理 。 這種通信模型有一個弊端:HTTP 協(xié)議無法實現(xiàn)服務(wù)器主動向客戶端發(fā)起消

    2023年04月26日
    瀏覽(20)
  • 【你的第一個socket應(yīng)用】Vue3+Node實現(xiàn)一個WebSocket即時通訊聊天室

    【你的第一個socket應(yīng)用】Vue3+Node實現(xiàn)一個WebSocket即時通訊聊天室

    這篇文章主要是用WebSocket技術(shù)實現(xiàn)一個 即時通訊聊天室 ,首先先要了解為什么使用WebSocket而不是普通的HTTP協(xié)議,如果使用HTTP協(xié)議它是下面這種情況: 我發(fā)送一條消息,發(fā)送一個發(fā)送消息的請求;* 一直輪詢接收別人發(fā)送的消息,不管有沒有發(fā)送都要定時去調(diào)用接口。這里明

    2023年04月20日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包