首页
/ WebSocket Client & Server 在 Node.js 中的实现

WebSocket Client & Server 在 Node.js 中的实现

2024-12-24 19:22:43作者:贡沫苏Truman

1. 安装指南

在项目根目录下执行以下命令以安装 WebSocket:

$ npm install websocket

2. 项目使用说明

本项目为 WebSocket 协议版本 8 和 13 的纯 JavaScript 实现,适用于 Node.js 环境。项目中包含了服务器和客户端的示例应用程序,用于实现各种互操作性测试协议,位于 "test/scripts" 文件夹中。

3. 项目API使用文档

完整的 API 文档位于项目目录下的 "docs" 文件夹中。

4. 项目安装方式

请参考安装指南部分,使用 npm 进行安装。


特性

  • 根据 Apache License 2.0 授权
  • 支持 "8" 和 "13" 版本的协议帧和握手
  • 支持处理和聚合接收到的分段消息
  • 支持分段发送消息
  • 支持在多个路径和协议组合上挂载多个应用程序的路由器
  • 出站连接支持 TLS
  • 服务器连接支持 TLS(使用 https.createServer 而不是 http.createServer
  • 支持设置和解析 Cookie
  • 可调整的设置,包括最大可接收帧大小、最大聚合接收消息大小、是否自动发送 ping 帧、ping 间隔、是否自动组装接收的分片等
  • 遵循 W3C WebSocket API,适用于 Node.js 和浏览器环境

已知问题/缺失特性

  • 缺少供用户提供的协议扩展的 API

使用示例

服务器示例

以下是一个简单的服务器示例,它会将接收到的任何消息(无论是 utf-8 还是二进制)回显。

var WebSocketServer = require('websocket').server;
var http = require('http');

var server = http.createServer(function(request, response) {
    console.log((new Date()) + ' 接收到请求:' + request.url);
    response.writeHead(404);
    response.end();
});
server.listen(8080, function() {
    console.log((new Date()) + ' 服务器正在监听端口 8080');
});

wsServer = new WebSocketServer({
    httpServer: server,
    // 生产环境中的应用程序不应使用 autoAcceptConnections,因为它会击败协议和浏览器中内置的所有标准跨源保护机制。
    autoAcceptConnections: false
});

function originIsAllowed(origin) {
  // 在此处添加逻辑以检测指定的源是否被允许。
  return true;
}

wsServer.on('request', function(request) {
    if (!originIsAllowed(request.origin)) {
      // 确保我们只接受来自允许源的请求
      request.reject();
      console.log((new Date()) + ' 来自源 ' + request.origin + ' 的连接被拒绝。');
      return;
    }
    
    var connection = request.accept('echo-protocol', request.origin);
    console.log((new Date()) + ' 连接已接受。');
    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log('接收到的消息:' + message.utf8Data);
            connection.sendUTF(message.utf8Data);
        }
        else if (message.type === 'binary') {
            console.log('接收到的二进制消息长度为 ' + message.binaryData.length + ' 字节');
            connection.sendBytes(message.binaryData);
        }
    });
    connection.on('close', function(reasonCode, description) {
        console.log((new Date()) + ' 对等节点 ' + connection.remoteAddress + ' 断开连接。');
    });
});

客户端示例

以下是一个简单的客户端示例,它会在控制台上打印出它接收到的任何 utf-8 消息,并定期发送一个随机数。

此代码演示的是在 Node.js 中的客户端,而不是在浏览器中

var WebSocketClient = require('websocket').client;

var client = new WebSocketClient();

client.on('connectFailed', function(error) {
    console.log('连接错误:' + error.toString());
});

client.on('connect', function(connection) {
    console.log('WebSocket 客户端已连接');
    connection.on('error', function(error) {
        console.log("连接错误: " + error.toString());
    });
    connection.on('close', function() {
        console.log('echo-protocol 连接已关闭');
    });
    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log("接收到的消息: '" + message.utf8Data + "'");
        }
    });
    
    function sendNumber() {
        if (connection.connected) {
            var number = Math.round(Math.random() * 0xFFFFFF);
            connection.sendUTF(number.toString());
            setTimeout(sendNumber, 1000);
        }
    }
    sendNumber();
});

client.connect('ws://localhost:8080/', 'echo-protocol');

使用 W3C WebSocket API 的客户端示例

与上面相同的示例,但是使用 W3C WebSocket API。

var W3CWebSocket = require('websocket').w3cwebsocket;

var client = new W3CWebSocket('ws://localhost:8080/', 'echo-protocol');

client.onerror = function() {
    console.log('连接错误');
};

client.onopen = function() {
    console.log('WebSocket 客户端已连接');

    function sendNumber() {
        if (client.readyState === client.OPEN) {
            var number = Math.round(Math.random() * 0xFFFFFF);
            client.send(number.toString());
            setTimeout(sendNumber, 1000);
        }
    }
    sendNumber();
};

client.onclose = function() {
    console.log('echo-protocol 客户端已关闭');
};

client.onmessage = function(e) {
    if (typeof e.data === 'string') {
        console.log("接收到的消息: '" + e.data + "'");
    }
};
登录后查看全文
热门项目推荐

项目优选

收起
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
148
1.95 K
kernelkernel
deepin linux kernel
C
22
6
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
192
274
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
145
189
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
931
555
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
980
395
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
75
66
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.11 K
0
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
65
515