2017-02-15 49 views
1

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

在“发送”功能下的子进程下的节点文档(​​)中,它表示第二个参数可以是父节点可以共享的子对象12的TCP对象。

当我尝试传递一个ws对象时,它说“抛出新的TypeError('这个句柄类型不能被发送');”。我想这是因为它是一个ws对象,而不是一个tcp对象,但我想知道是否有无法实现与ws对象相同的效果而不是tcp对象...?由于ws只是一个符合websocket标准的tcp对象的包装。

回答

5

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

WebSockets是完全不同的。它们是第7层(HTTP)连接之上的隐喻结构。在层5+中,应用程序本身会进行一些超出操作系统提供的通信 - 处理标头,cookie,WS连接状态等。这不仅仅是可以用整数句柄编码,所以Node当前不有一种方法可以传递给他们。

通常情况下,大多数需要连接的应用程序都是以原始级别接受TCP连接,将THAT传递给子级,然后允许子级从那里处理HTTP(和WS)。他们不会在主流程和子流程之间共享这项工作。对不起,这不是你想要的答案,但是如果你已经围绕这个期望建立起来的话,你的应用程序体系结构将需要重新思考。顺便说一下,这不仅仅是Node。这也适用于任何其他语言,比如Python或Ruby,因为所有这些只是Berkeley Sockets构造的高级包装器,并且在该层中传递的套接字是基于句柄的,如上所述。

+0

我明白了。这同样适用于集群类吗? (https://nodejs.org/api/cluster.html)。可以使用它,还是需要成为一个原始的http/tcp对象? – user1157885

+0

是的。 Cluster类只是child_process本身的语法糖。它提供了一些有用的组件,用于启动和停止童工,维持固定的工作人员数量,并让孩子和家长相互交谈。但它不会增加任何额外的东西来允许WS连接移动。 –