node.js - NodeJS 将 ws 对象传递给子进程

标签 node.js tcp process websocket subprocess

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

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

当我尝试传递一个 ws 对象时,它说“抛出新的 TypeError('This handle type can\'t be sent');”。我想这是因为它是一个 ws 对象而不是一个 tcp 对象,但我想知道是否有办法用 ws 对象而不是 tcp 对象达到同样的效果......?因为 ws 只是一个符合 websocket 标准的 tcp 对象的包装器。

最佳答案

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

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

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

关于node.js - NodeJS 将 ws 对象传递给子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42258467/

相关文章:

qt - QNetworkAccessManager 发送 GET 两次

java - 在哪里可以找到 Android java.lang.Process waitFor() 退出代码的引用?

javascript - 为什么我的 promise 返回未定义?

javascript - 在套接字 io 上使用 Node 请求库时出错

javascript - 如何以编程方式获取 Node.js 函数的定义位置?

node.js - Express 没有为 React 构建正确提供静态文件

java - Android TCP 连接到 C 服务器 : String transferred is noisy

sockets - Ettercap TCP 数据包类型

C++错误:undefined reference to `EnumProcesses@12

java - 单个 JVM 实例中的进程数