2017-02-15 10 views
1

子プロセスにwsオブジェクトを渡そうとしています。子プロセスにwsオブジェクトを渡すNodeJS

"send"関数の下の子プロセス(​​)の下のノードドキュメントでは、2番目のパラメータは、子の&親が共有できるTCPオブジェクトである可能性があります。

wsオブジェクトを渡そうとすると、「新しいTypeErrorを投げる(このハンドルタイプは送信できません)」;というメッセージが表示されます。私はそれがwsオブジェクトで、tcpオブジェクトではないからだと思いますが、tcpオブジェクトではなくwsオブジェクトで同じ効果を達成するにはどうしたらいいのでしょうか? wsはwebsocket標準に準拠したtcpオブジェクトのラッパーです。

答えて

5

残念ながら、WSソケットは生のTCPオブジェクトではありません。 TCPソケットはレイヤー4の構造であり、プロセス間で生のハンドル(基本的には整数、ほとんどの基礎となるOSのメタファー)に渡すことができます。オペレーティングシステム自体はセッション状態管理のようなTCP操作のすべてを処理しますが、ハンドルを回したい

ウェブソケットはまったく異なります。それらは、レイヤー7(HTTP)接続の上に隠喩的な構造です。レイヤー5+では、アプリケーション自体が、オペレーティングシステムが提供するものを超えて、ヘッダー、クッキー、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接続を移動させるために余分なものは追加しません。 –

関連する問題