前言

在一次项目需求会上,有个新需求是要让用户从管理后台主动下发数据到app前端,从而让前端那边对这主动下发的数据做一些用户交互。实现思路很清晰,用Websocket的方式。
Websocket 是一种自然的全双工、双向、单套接字连接,是建立在 TCP 协议上的。 相比于 HTTP 协议,Websocket 链接一旦建立,即可进行双向的实时通信;

ws模块安装

由于后台是基于node koa2 mongo进行开发的。纯node项目,基于node下的websocket中间件有很多,第一时间想要用的是koa-websocket。 这个中间件使用起来很简单,这是官网(很简单有时间去看一下https://www.npmjs.com/package/koa-websocket)。

可是最后,项目中还是放弃使用koa-websocket,一是因为这个中间件看着很久没人维护,后续有问题不好解决。二是这个需要重新监听新端口,如果只是为了一个功能而新监听端口,有点浪费多余。最后我选择了ws模块,ws文档地址。

毕竟在Node.js中,使用最广泛的WebSocket模块是ws。

首先安装ws模块

npm install ws --save

websocket初始化

第一步:引入ws模块

const WebSocket = require('ws')

第二步: 需要创建一个ws服务模块,挂载到现有server服务器上,目的是和原有server使用同一端口,path是指定这个websocket的请求路径,避免无效连接。

class ws {
    static online = 0 // 在线连接
    static ws = WebSocket.Server //默认实例
    static init(server) {
        // 创建实例
        this.ws = new WebSocket.Server({ server,path: '/**/**/websockets'}); 
    } 
    // 发送客户端数据
    static sendToCliect(Data) {}
}
module.exports = ws

第三步:连接处理,在websocket与客户连接中,我们需要处理各种的情况,来判断是否要关闭断开连接。connection事件回调函数中我们能接收到当前连接的ws实例与当前请求信息request。这方便我们进行当前连接处理

static init(server) {
    // 创建实例
    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当前在线${this.online}个连接`)
        const {
            query: { id }
        } = quertString.parseUrl(request.url);
        if (!id) {
            return ws.close();
        } 
        try {
           //do something
           // 这里可以做一些加强判断查询数据库等行为

            ws.id = id // 添加ws实例的唯一标识
            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下发数据

主动下发数据,需要找到对应的请求方,将数据准确的返回到对应的接收方,这时候就用到了在连接是添加的唯一实例标识。现在创建一个发送数据的函数。

class ws {
    
    // 发送客户端数据
    static sendToCliect(Data) {
        let iskeep = false // 加个变量做下发成功判断
        if (!(this.ws instanceof WebSocket.Server)) {
            return iskeep;
        }
        const {id } = Data
        this.ws.clients.forEach((client) => {
            if (client.readyState === WebSocket.OPEN && client.id === id) { 
                // 发送给指定匹配id
                client.send(JSON.stringify(Data));
                iskeep = true
            }
        });
        return iskeep; 
    }
}

使用

const WS = require('../wss/websocket')
// do something 
const data ={}
const send =  WS.sendToCliect(data) // 下发数据
if(send){
    return 'success' 
}

return '下发失败,连接实例断开或异常'

总结

在客户端中,使用websocket很简单

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

注意:ws服务是独立于koa执行的一个服务,虽然他们共用一个端口,但是并不会经过koa中间件,所以koa中间件有一些鉴权将失效,需要在ws服务里独立判断。
以上就是koa项目中简单的使用ws模块进行websocket开发。

到此这篇关于在koa中简单使用Websocket连接的方法示例的文章就介绍到这了,更多相关koa使用Websocket连接内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

在koa中简单使用Websocket连接的方法示例的更多相关文章

  1. 五分钟学会HTML5的WebSocket协议

    这篇文章主要介绍了五分钟学会HTML5的WebSocket协议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – Websockets可以在移动电话上工作吗?

    相关地,我怀疑长轮询客户端可能是实现类似功能的好方法,但我想知道我可能遇到的移动特定问题.到目前为止,我已经读过长时间的轮询请求可能会对电池寿命产生相当大的影响.我还听说iOS以某种方式限制了对单个服务器的连接数量,这可能是个问题.有没有人在使用实时组件的移动应用程序上工作?

  5. ios-swift,objective-c协议实现

    作为隐式解开的可选项.

  6. ios – 红蜘蛛代表没有被召集

    变量不是nil,我有一个很好的连接,url是正确的,但没有调用委托方法.我也正在实现WebSocketDelegate解决方法套接字应该是您的类的属性或变量,以确保它附近.如果仅在函数堆栈上分配它,它将超出范围,并且永远不会调用委托以下是我在项目中使用的代码,以防万一这是link到故事板,以防万一你想要

  7. swift 实现websocket与后台通信(swift 如何构建简单的json字符串)

    一个应用不可避免要与服务器进行通信,主要有,http与socket。http暂时不论,我们先看看socket下面衍生的websocket,今天我就把自己怎么利用websocket与服务器进行交互记录下来:首先你需要集成websocket到自己的项目,如果不明白如何集成,请看上一篇《swift集成websocket库》集成websocket到自己项目后还需要添加SwiftyJSON到自己项目,具体步骤和集成websocket一样。首先打开你项目,记得通过cocoapods生成的.xcworkspace文件打

  8. 如何在Android上托管REST webservices?

    有没有人知道一个用Java编写的能够在Android上托管REST服务的开源Web服务器?

  9. android – WebSocket没有关闭重装应用程序(React Native)

    附:哦,我用Android进行测试.解决方法你的代码看起来不错.通过刷新你的意思是在调试模式下运行时刷新javascript?

  10. android – 移动设备上的WebSocket支持

    对于Android多人游戏的玩家之间的通信,我正在使用WebSocket服务器和客户端的TooTallNate’sJavalibrary,以在Android应用程序中启用WebSocket支持.所以只是要明确指出,移动浏览器中的WebSocket支持对我来说并不重要.不幸的是,用户报告说他们遇到了连接失败或未接收消息等问题.这是移动设备上WebSockets的一般问题,还是客户端代码中的一个缺陷?您是否具有WebSocket客户端库的经验,例如上面的那个?WebSocket技术不是完全正确的解决方案,因此

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部