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

在koa中簡單使用Websocket連接的方法示例

 更新時間:2022年02月10日 09:27:19   作者:帶上小魚干去旅游吖  
本文主要介紹了在koa中簡單使用Websocket連接的方法示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

在一次項目需求會上,有個新需求是要讓用戶從管理后臺主動下發(fā)數(shù)據(jù)到app前端,從而讓前端那邊對這主動下發(fā)的數(shù)據(jù)做一些用戶交互。實現(xiàn)思路很清晰,用Websocket的方式。
Websocket 是一種自然的全雙工、雙向、單套接字連接,是建立在 TCP 協(xié)議上的。 相比于 HTTP 協(xié)議,Websocket 鏈接一旦建立,即可進行雙向的實時通信;

ws模塊安裝

由于后臺是基于node+koa2+mongo進行開發(fā)的。純node項目,基于node下的websocket中間件有很多,第一時間想要用的是koa-websocket。 這個中間件使用起來很簡單,這是官網(wǎng)(很簡單有時間去看一下https://www.npmjs.com/package/koa-websocket)。

可是最后,項目中還是放棄使用koa-websocket,一是因為這個中間件看著很久沒人維護,后續(xù)有問題不好解決。二是這個需要重新監(jiān)聽新端口,如果只是為了一個功能而新監(jiān)聽端口,有點浪費多余。最后我選擇了ws模塊,ws文檔地址

畢竟在Node.js中,使用最廣泛的WebSocket模塊是ws。

首先安裝ws模塊

npm install ws --save

websocket初始化

第一步:引入ws模塊

const WebSocket = require('ws')

第二步: 需要創(chuàng)建一個ws服務(wù)模塊,掛載到現(xiàn)有server服務(wù)器上,目的是和原有server使用同一端口,path是指定這個websocket的請求路徑,避免無效連接。

class ws {
? ? static online = 0 // 在線連接
? ? static ws = WebSocket.Server //默認(rèn)實例
? ? static init(server) {
? ? ? ? // 創(chuàng)建實例
? ? ? ? this.ws = new WebSocket.Server({ server,path: '/**/**/websockets'});?
? ? }?
? ? // 發(fā)送客戶端數(shù)據(jù)
? ? static sendToCliect(Data) {}
}
module.exports = ws

第三步:連接處理,在websocket與客戶連接中,我們需要處理各種的情況,來判斷是否要關(guān)閉斷開連接。connection事件回調(diào)函數(shù)中我們能接收到當(dāng)前連接的ws實例與當(dāng)前請求信息request。這方便我們進行當(dāng)前連接處理

static init(server) {
? ? // 創(chuàng)建實例
? ? this.ws = new WebSocket.Server({ server,path: '/**/**/websockets'});?
? ? this.ws.on('connection', async (ws, request) => {
? ? ? ? if(!(request.url.includes('/**/**/websockets'))){
? ? ? ? ? ? return ws.close();
? ? ? ? }
? ? ? ? this.online = this.ws._server._connections;
? ? ? ? console.log(`socket當(dāng)前在線${this.online}個連接`)
? ? ? ? const {
? ? ? ? ? ? query: { id }
? ? ? ? } = quertString.parseUrl(request.url);
? ? ? ? if (!id) {
? ? ? ? ? ? return ws.close();
? ? ? ? }?
? ? ? ? try {
? ? ? ? ? ?//do something
? ? ? ? ? ?// 這里可以做一些加強判斷查詢數(shù)據(jù)庫等行為

? ? ? ? ? ? ws.id = id // 添加ws實例的唯一標(biāo)識
? ? ? ? ? ? const obj = {"message":"連接成功","retCode": 200}
? ? ? ? ? ? ws.send(JSON.stringify(obj))
? ? ? ? } catch (error) {
? ? ? ? ? ? console.log('websocket connection error',error)
? ? ? ? ? ? return ws.close();
? ? ? ? }
? ? });
} ?

第四步: 掛載到項目server下,koa項目的啟動文件基本在bin/www文件下

const app = require('../app')
const http = require('http');
const WS = require('../wss/websocket')
/**
?* Create HTTP server.
?*/
const server = http.createServer(app.callback());

/**
?* Create Socket server.
?*/
?
?WS.init(server)
?
?/**
?* Listen on provided port, on all network interfaces.
?*/

server.listen(9000,'0.0.0.0');

websocket下發(fā)數(shù)據(jù)

主動下發(fā)數(shù)據(jù),需要找到對應(yīng)的請求方,將數(shù)據(jù)準(zhǔn)確的返回到對應(yīng)的接收方,這時候就用到了在連接是添加的唯一實例標(biāo)識?,F(xiàn)在創(chuàng)建一個發(fā)送數(shù)據(jù)的函數(shù)。

class ws {
? ??
? ? // 發(fā)送客戶端數(shù)據(jù)
? ? static sendToCliect(Data) {
? ? ? ? let iskeep = false // 加個變量做下發(fā)成功判斷
? ? ? ? if (!(this.ws instanceof WebSocket.Server)) {
? ? ? ? ? ? return iskeep;
? ? ? ? }
? ? ? ? const {id } = Data
? ? ? ? this.ws.clients.forEach((client) => {
? ? ? ? ? ? if (client.readyState === WebSocket.OPEN && client.id === id) {?
? ? ? ? ? ? ? ? // 發(fā)送給指定匹配id
? ? ? ? ? ? ? ? client.send(JSON.stringify(Data));
? ? ? ? ? ? ? ? iskeep = true
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? return iskeep;?
? ? }
}

使用

const WS = require('../wss/websocket')
// do something?
const data ={}
const send = ?WS.sendToCliect(data) // 下發(fā)數(shù)據(jù)
if(send){
? ? return 'success'?
}

return '下發(fā)失敗,連接實例斷開或異常'

總結(jié)

在客戶端中,使用websocket很簡單

const ws = new WebSocket(`ws://***.***.***/websocket`)
ws.onopen = () => {
? ? console.log('WebSocket onopen')
}
ws.onmessage = e => {
? ? //接收消息并處理
}

注意:ws服務(wù)是獨立于koa執(zhí)行的一個服務(wù),雖然他們共用一個端口,但是并不會經(jīng)過koa中間件,所以koa中間件有一些鑒權(quán)將失效,需要在ws服務(wù)里獨立判斷。
以上就是koa項目中簡單的使用ws模塊進行websocket開發(fā)。

到此這篇關(guān)于在koa中簡單使用Websocket連接的方法示例的文章就介紹到這了,更多相關(guān)koa使用Websocket連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Node.js+Koa框架實現(xiàn)前后端交互的方法

    利用Node.js+Koa框架實現(xiàn)前后端交互的方法

    這篇文章主要給大家介紹了利用Node.js+Koa框架實現(xiàn)前后端交互的方法,文中介紹的非常詳細,對大家具有一定的參考價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-02-02
  • node.js使用yargs處理命令行參數(shù)操作示例

    node.js使用yargs處理命令行參數(shù)操作示例

    這篇文章主要介紹了node.js使用yargs處理命令行參數(shù)操作,結(jié)合實例形式分析了yargs庫的安裝及node.js使用yargs處理命令行參數(shù)具體實現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • 深入理解Node.js回調(diào)函數(shù)

    深入理解Node.js回調(diào)函數(shù)

    這篇文章主要介紹了Node.js回調(diào)函數(shù),為了解決回調(diào)函數(shù)的缺點,出現(xiàn)了一些替代方案,如Promise、async/await等,這些方案提供了更簡潔、可讀性更高的代碼結(jié)構(gòu),使異步編程更加容易和可維護,需要的朋友可以參考下
    2023-11-11
  • Node.js中的package.json與cnpm命令行工具介紹

    Node.js中的package.json與cnpm命令行工具介紹

    這篇文章介紹了Node.js中的package.json與cnpm命令行工具,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Nodejs搭建wss服務(wù)器教程

    Nodejs搭建wss服務(wù)器教程

    這篇文章主要為大家詳細介紹了Nodejs搭建wss服務(wù)器的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • node的EventEmitter模塊基本用法簡單實現(xiàn)示例

    node的EventEmitter模塊基本用法簡單實現(xiàn)示例

    這篇文章主要為大家介紹了node的EventEmitter模塊基本用法簡單實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • nodeJS實現(xiàn)簡單網(wǎng)頁爬蟲功能的實例(分享)

    nodeJS實現(xiàn)簡單網(wǎng)頁爬蟲功能的實例(分享)

    下面小編就為大家?guī)硪黄猲odeJS實現(xiàn)簡單網(wǎng)頁爬蟲功能的實例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 如何讓node運行es6模塊文件及其原理詳解

    如何讓node運行es6模塊文件及其原理詳解

    這篇文章主要介紹了如何讓node運行es6模塊文件及其原理詳解,詳細的介紹了2種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Node.js插件的正確編寫方式

    Node.js插件的正確編寫方式

    正如Node.js在官方說明文檔中所言,插件是以動態(tài)方式進行鏈接的共享式對象,能夠?qū)avaScript代碼與C/C++庫接駁起來。這意味著我們可以引用任何來自C/C++庫中的內(nèi)容,并通過創(chuàng)建插件的方式將其納入到Node.js當(dāng)中。
    2014-08-08
  • Node實現(xiàn)前端本地開發(fā)接口代理服務(wù)

    Node實現(xiàn)前端本地開發(fā)接口代理服務(wù)

    本文主要介紹了Node實現(xiàn)前端本地開發(fā)接口代理服務(wù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論