Nodejs WebSocket更新后,解决Sec-WebSocket-Key问题------>思路

Nodejs WebSocket更新后,解决Sec-WebSocket-Key问题------>思路

前几天对WebSocket很有兴趣,想自己玩个东西出来,结果总是遇上这个问题,网上的文章基本都是基于node-websocket-server,但是这个很老了,github公告上显示仅支持到76协议,目前的是RFC-6455,有很多差异,比如Sec-WebSocket-Key问题,如果有同仁在学习这个,建议大家换用WebSocket-Node,已解决,效果不错,详情我明天去公司再发,不要喷哦,我标题写得很清楚,思路而已。 对了,npm上可以直接更新的,可能会提示用户安装VC和Delphi,其实是可选的,解决一些编码问题等等,并不影响主要功能。


2 回复

Nodejs WebSocket更新后,解决Sec-WebSocket-Key问题------>思路

前几天我对WebSocket产生了浓厚的兴趣,想要自己动手实现一个小项目。然而,在过程中遇到了一个棘手的问题——如何处理WebSocket的Sec-WebSocket-Key。在网上查找资料时,大多数教程都基于过时的库如node-websocket-server,它仅支持到76协议,而最新的标准是RFC-6455,两者之间存在显著差异。

具体来说,Sec-WebSocket-Key是RFC-6455中引入的一个重要字段,用于验证WebSocket连接的有效性。旧版库不支持这一新特性,导致我们无法顺利建立新的WebSocket连接。幸运的是,使用WebSocket-Node可以很好地解决这个问题。

使用WebSocket-Node库

首先,你需要确保你的Node.js环境已经安装了WebSocket-Node库。你可以通过以下命令进行安装:

npm install websocket

然后,你可以创建一个新的WebSocket服务器来处理连接请求。以下是一个简单的示例代码:

const WebSocket = require('websocket').w3cwebsocket;

const server = new WebSocket.Server({
    port: 8080
});

server.on('request', (req) => {
    console.log('Connection from origin ' + req.origin + '.');
    const connection = req.accept();
    console.log('Connection accepted.');
    
    connection.on('message', (message) => {
        console.log('Received Message: ' + message.utf8Data);
        connection.sendUTF('Hello! Echo message back to you.');
    });
    
    connection.on('close', (reasonCode, description) => {
        console.log('Client has disconnected.');
    });
});

解释

  1. 安装库:首先,我们需要安装WebSocket-Node库,这是一个广泛使用的WebSocket库,支持最新的RFC-6455标准。

  2. 创建WebSocket服务器:在上面的代码中,我们创建了一个WebSocket服务器,监听8080端口。当客户端发起连接请求时,服务器会接受该连接。

  3. 处理消息:一旦连接建立,服务器就可以接收和发送消息。在这个例子中,我们简单地将接收到的消息回传给客户端。

  4. 关闭连接:当客户端断开连接时,服务器也会相应地处理关闭事件。

通过这种方式,我们可以轻松地解决Sec-WebSocket-Key问题,并且能够利用WebSocket-Node库的其他强大功能。希望这些信息对你有所帮助!


在使用Node.js处理WebSocket时,如果遇到Sec-WebSocket-Key问题,通常是因为使用的库版本较旧或不兼容最新的WebSocket协议。针对这种情况,推荐使用更新且活跃维护的库,如WebSocket-Node

解决思路

  1. 切换到支持最新协议的库:如果你当前使用的是一个老旧的库(如node-websocket-server),建议更换为支持最新WebSocket协议(如RFC-6455)的库。WebSocket-Node是一个不错的选择。

  2. 安装WebSocket-Node库

    npm install websocket
    
  3. 创建WebSocket服务器:使用WebSocket-Node来创建一个WebSocket服务器,并正确处理Sec-WebSocket-Key

示例代码

const WebSocket = require('websocket').server;
const http = require('http');

// 创建HTTP服务器
const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end('WebSocket Server');
});

// 将WebSocket服务器绑定到HTTP服务器
server.listen(8080, () => {
  console.log('Server is listening on port 8080');
});

const wsServer = new WebSocket({
  httpServer: server,
  autoAcceptConnections: false // 设置为false以便我们可以验证客户端
});

wsServer.on('request', (req) => {
  const connection = req.accept('echo-protocol', req.origin);

  console.log(`Connection accepted from ${req.origin}`);
  
  connection.on('message', (message) => {
    if (message.type === 'utf8') {
      console.log(`Received Message: ${message.utf8Data}`);
      connection.sendUTF(message.utf8Data); // 回复相同的消息
    }
  });

  connection.on('close', (reasonCode, description) => {
    console.log(`Peer ${connection.remoteAddress} disconnected.`);
  });
});

解释

  • WebSocket-Node:这是一个Node.js的WebSocket库,支持最新的WebSocket协议(RFC-6455),可以正确处理Sec-WebSocket-Key
  • http.createServer:创建一个HTTP服务器实例。
  • WebSocket({ httpServer }):将WebSocket服务器与HTTP服务器关联起来。
  • accept():接受连接请求并创建WebSocket连接对象,这里我们允许所有连接并打印日志。
  • on(‘message’):监听接收到的消息,并发送回相同的消息给客户端。
  • on(‘close’):监听连接关闭事件。

通过这种方式,你可以解决Sec-WebSocket-Key的问题,并确保你的WebSocket服务器能够正常运行。

回到顶部