【问题标题】:NodeJS passing a ws object to a child processNodeJS将ws对象传递给子进程
【发布时间】:2017-07-04 15:36:30
【问题描述】:

我正在尝试将 ws 对象传递给子进程。

在子进程 (https://nodejs.org/api/child_process.html) 下的“发送”函数下的节点文档中,它说第二个参数可以是子进程和父进程可以共享的 TCP 对象。

当我尝试传递一个 ws 对象时,它会显示“throw new TypeError('This handle type can\'t be sent');”。我想这是因为它是 ws 对象而不是 tcp 对象,但我想知道是否有任何方法可以使用 ws 对象而不是 tcp 对象来实现相同的效果......?因为 ws 只是符合 websocket 标准的 tcp 对象的包装器。

【问题讨论】:

    标签: node.js tcp process websocket subprocess


    【解决方案1】:

    不幸的是,WS 套接字不是原始 TCP 对象。 TCP 套接字是第 4 层结构,可以在进程之间作为原始句柄(基本上是整数,在大多数底层操作系统隐喻中)传递。操作系统本身处理所有 TCP 操作,如会话状态管理,这在处理进程时很重要想要传递句柄。

    WebSockets 完全不同。它们是第 7 层 (HTTP) 连接之上的隐喻结构。在第 5 层以上,应用程序本身进行了大量的通信,超出了操作系统提供的范围——处理标头、cookie、WS 连接状态等。这超出了可以在整数句柄中编码的范围,因此 Node 目前没有有办法传递它们。

    通常,大多数需要以这种方式传递连接的应用程序都接受原始级别的 TCP 连接,将其传递给子级,然后允许子级从那里处理 HTTP(和 WS)。他们不会在主进程和子进程之间共享这项工作。抱歉,这不是您想要的答案,但如果您围绕此期望构建,您的应用程序架构将需要重新考虑。顺便说一句,不仅仅是 Node 是这样的。这也适用于任何其他语言,例如 Python 或 Ruby,因为所有这些都只是 Berkeley Sockets 结构的高级包装,并且在该层中传递的套接字是基于句柄的,如上所述。

    【讨论】:

    • 我明白了。这同样适用于集群类吗? (nodejs.org/api/cluster.html)。 ws 可以与它​​一起使用还是必须是原始的 http/tcp 对象?
    • 是的。 Cluster 类只是 child_process 本身的语法糖。它提供了许多有用的组件,用于启动和停止童工、维持设定的工人数量以及让孩子和父母相互交谈。但它并没有添加任何额外的东西来允许移动 WS 连接。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2019-04-07
    • 2019-12-26
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多