我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在koa中简单使用Websocket连接的方法示例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在koa中简单使用Websocket连接的方法示例

前言

在一次项目需求会上,有个新需求是要让用户从管理后台主动下发数据到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')

const server = http.createServer(app.callback());


 
 WS.init(server)
 
 

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连接内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在koa中简单使用Websocket连接的方法示例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

php中WebSocket的简单使用示例详解

本文详细介绍了PHP中WebSocket的使用示例。首先,安装WebSocket服务器库。然后,创建一个WebSocket应用程序,定义一个处理程序并将其连接到服务器。客户端通过WebSocket连接发送和接收消息。最后,提供了示例代码并讨论了注意事项,包括端口一致性、HTTPS安全性和非活动连接清理。
php中WebSocket的简单使用示例详解
2024-04-02

es6中some和every方法使用简单示例

JavaScript在ES6版本后提供了一些更加便捷的方法供开发者使用,实现原理其实是在对应的构造函数原型提供方法,下面这篇文章主要给大家介绍了关于es6中some和every方法使用的相关资料,需要的朋友可以参考下
2023-05-14

Android使用socket创建简单TCP连接的方法

本文实例讲述了Android使用socket创建简单TCP连接的方法。分享给大家供大家参考,具体如下: 不管是在Java还是Android编程中,通信都是及其重要的一部分。有连接的socket编程,重要性自然毋庸置疑。 这里以一个简单的de
2022-06-06

Java数据结构之简单的连接点(link)实现方法示例

本文实例讲述了Java数据结构之简单的连接点(link)实现方法。分享给大家供大家参考,具体如下:一、概述:链接点由:数据和指向下个数据的指针构成如图:二、简单实现:package com.java.link;/** * @描述 TODO
2023-05-30

pandas中拼接字符串cat()方法的使用示例

小编给大家分享一下pandas中拼接字符串cat()方法的使用示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!既然在pandas中有分割字符串的方法,那么也是拼
2023-06-14

Python中使用插入排序算法的简单分析与代码示例

问题描述 将一组随机排列的数字重新按照从小到大的顺序排列。 插入算法 每次从数组中取一个数字,与现有数字比较并插入适当位置。 如此重复,每次均可以保持现有数字按照顺序排列,直到数字取完,即排序成功。 这很像打牌时的抓牌情况, 第一个条件:保
2022-06-04

在Linux命令行终端中使用python的简单方法(推荐)

Linux终端中的操作均是使用命令行来进行的。因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来。 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令
2022-06-04

在思科IOS中限制NAT的单用户连接数的操作方法

  NAT中文意思是"网络地址转换",它是一个IETF标准,允许一个整体机构以一个公用IP地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。那么今天小编要为大家分享的教程是:在思科iOS中限制NAT的单用户连接数的操作方法。  一、前提概要  在CiscoIOS
在思科IOS中限制NAT的单用户连接数的操作方法
2024-04-17

XP系统连接提示错误633:调制解调器已在使用的解决方法图文教程

近来,一位xp系统用户反馈自己重启路由器后,设置了账号和密码。可是电脑开机右下角提示本地连接已连接上,却无法联网,连接提示“正在打开端口…错误 633: 调制解调器(或其它连接设备)已在使用,或没有正确配置&rdq
2023-05-21

编程热搜

目录