【问题标题】:WebSocket Data Parsing with Node.js使用 Node.js 解析 WebSocket 数据
【发布时间】:2015-11-09 10:06:15
【问题描述】:

客户端上的 Websocket:

socket.send('helloworld');

Node.js 上的 Websocket:

socket.ondata = function(d, start, end){
     // I suppose that the start and end indicates the location of the 
     // actual data 'hello world' after the headers
     var data = d.toString('utf8', start, end);
     
     // Then I'm just printing it
     console.log(data);
});

但我得到了这个:�����]���1���/�� 在终端上:O

我试图理解这个文档:https://www.rfc-editor.org/rfc/rfc6455#section-5.2 但很难理解,因为我不知道我应该使用什么,我的意思是即使使用 toString 我也看不到数据?

我试图关注并测试这个问题的答案How can I send and receive WebSocket messages on the server side?,但我无法让它工作,通过这个答案我得到了一个像这样的数组 [false, true, false, false, true, true, false] 等等...我真的不知道该怎么处理它.. :\

所以我有点迷茫,从客户端获取数据后我到底应该怎么做才能得到真正的消息?

我使用的是原始客户端和 node.js API,没有任何库。

【问题讨论】:

  • I'm using the original client side and node.js API without any library. 为什么不直接使用socket.io 库?
  • @pkyeck 因为我想了解 websockets 是如何工作的 :),我对 socket.io 没有任何问题,我已经使用了它,它很酷,但我是那种想要的人更深入:)

标签: node.js parsing websocket server-side


【解决方案1】:

您使用的是哪个 node.js 库?从您正在挂钩看起来像 HTTP 服务器 API 的 socket.ondata 的事实来看。 WebSockets 不是 HTTP。它具有与 HTTP 兼容的握手,因此 WebSocket 和 HTTP 服务可以存在于同一个端口上,但这就是相似之处的结束。握手之后,WebSockets 是一个框架的全双工、长寿命的消息传输,它更类似于常规 TCP 套接字而不是 HTTP。

如果您想在 node.js 中实现自己的 WebSocket 服务器,您将希望直接使用套接字库(或构建/借用现有的 WebSocket 服务器代码)。

这是一个基于 Node.js 的 WebSocket 服务器,它从 WebSocket 桥接到 TCP 套接字:https://github.com/kanaka/websockify/blob/master/other/websockify.js 请注意,它适用于以前的 Hixie 版本的协议(我还没有机会或动机来更新它)。该协议的现代 HyBI 版本非常不同,但您可能能够从该实现中收集一些有用的信息。

【讨论】:

  • 非常感谢您的回答,正如我所说,我不使用任何外部库,仅使用原始 API,socket.ondata 来自 HTTP 更新事件,server.on('update', function(request, socket, head){ socket.ondata...})。我的问题是我看不到它在 websocket API 文档中写入的数据,我不知道我需要使用什么,我得到它但是以非常不可读的形式,所以我不能使用任何规则在上面,因为我没有看到任何方案,所以问题是我无法解码来自socket.ondata 的数据,如果你能帮助我理解那部分,我会很高兴:)
  • @CIRK,澄清一下,您不能将 HTTP 库用于 WebSocket,因为 WebSocket 不是 HTTP(最初的握手是相似的,但这是相似性结束的地方)。您必须在较低级别工作(例如在套接字级别)。您可以尝试参考现有的工作实现,例如 faye-websocket-node
  • 谢谢,但您是什么意思?我应该创建一个 TCP 服务器而不是一个 HTTP 服务器吗?
  • @CIRK,是的,当您收到连接通知时,您需要解析标头,而不是依赖 HTTP 服务器已经完成。
  • 我创建了一个TCP服务器,也是一样的,我可以发送消息但我不能解码它们:))
【解决方案2】:

可以实际上从 Node 的 HTTP API 开始。这正是我在编写 WebSocket-Node 模块时所做的 https://github.com/Worlize/WebSocket-Node

如果您不想使用现有的 WebSocket 库(尽管您确实应该只使用现有的库),那么您需要能够解析 RFC 定义的二进制数据格式。格式以及如何解释数据非常清楚。您必须从每一帧中读取所有标志,解释帧大小,可能读取掩码键,并在从线路中读取内容时取消掩码。

这是您看不到任何可识别内容的原因之一...在 WebSockets 中,所有客户端到服务器的通信都通过使用 XOR 作为安全预防措施对内容应用随机掩码来混淆,以防止可能毒化较旧的缓存不了解 websocket 的代理服务器。

【讨论】:

    【解决方案3】:

    有两件事——

    1. 您使用的是哪个 node.js 版本?我从未见过带有 start 和 endpt 的数据事件。发出的事件只是以缓冲区/字符串为参数的数据。

    2. 更重要的是,如果您要连接到 HTTP 套接字,则应该注意 HTTP 数据包。它包含听众、身体和预告片。里面可能有垃圾。

    【讨论】:

    • 感谢@Satyam Shekhar,我的node.js 版本是6.0,很好开始并且不是空的,它们都是数字,我已经测试过了,但我只是遵循了一些教程/其他作品,那就是为什么我以这种方式使用它。我不太明白你的 2. 点:\
    • ondata 是一个内部使用的属性......如果你能帮忙的话,你不想使用它。
    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2017-07-05
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多