Socket.io とクラスタリングを使用しています。私がする必要があるのは、複数の子プロセスを作成し、特定の [socket.io] ソケットをそれぞれに送信できるようにすることです。現在 (以下のコードを参照) [socket.io] ソケットをハンドルとして送信しようとすると、例外が発生します。
以下の私のコードにはそれがありません (最も基本的な例を機能させようとしているため) が、クライアントが接続できるようにして、メッセージに対してどのプロセスに進むかを伝えることです。したがって、クライアントはいくつかのデータを含む「init」メッセージを送信し、そのデータに基づいて [socket.io] ソケットを特定のプロセスに転送します。これが私の当初の計画でした。
すべての子プロセスから socket.io をリッスンできることはわかっていますが、クライアントが接続すると、それらのプロセスの 1 つだけが受信されます。
私の2つの質問は次のとおりです。
- socket.io ソケットを子プロセスに送信する方法はありますか?
- そうでない場合、どのプロセスがハンドルを取得するかを決定する別の方法はありますか? (各プロセスで異なる認証機能を使用できますか? あるプロセスがソケットを受け入れない場合、別のプロセスは受け入れられますか?)
var cluster = require('cluster');
if (cluster.isMaster) {
var io = require('socket.io').listen(80);
var cpuCount = require('os').cpus().length;
var children = [];
for (var i = 0; i < cpuCount; i += 1) {
children.push(cluster.fork());
}
//Master Process is listening for all connections
io.sockets.on('connection', function (socket) {
//upon a connection, send the 'handle' to a worker.
children[0].send('server', socket);
});
} else {
process.on('message', function (m, handle) {
//worker receives it here.
console.log('here');
});
}
スタック トレースを含むコンソール出力:
C:\Users\randy>node "C:\Users\randy\Documents\Visual Studio 2012\Projects\tesselconnect-server\tesselconnect-server\server.js"
info - socket.io started
debug - client authorized
info - handshake authorized bZCM2CVpFFdU9eU1zYwx
debug - setting request GET /socket.io/1/websocket/bZCM2CVpFFdU9eU1zYwx
debug - set heartbeat interval for client bZCM2CVpFFdU9eU1zYwx
debug - client authorized for
debug - websocket writing 1::
child_process.js:427
throw new TypeError("This handle type can't be sent");
^
TypeError: This handle type can't be sent
at ChildProcess.target.send (child_process.js:427:15)
at Worker.send (cluster.js:401:21)
at SocketNamespace.<anonymous> (C:\Users\randy\Documents\Visual Studio 2012\Projects\tesselconnect-server\tesselconnect-server\server.js:16:15)
at SocketNamespace.EventEmitter.emit [as $emit] (events.js:117:20)
at connect (C:\Users\randy\node_modules\socket.io\lib\namespace.js:292:10)
at C:\Users\randy\node_modules\socket.io\lib\namespace.js:308:13
at SocketNamespace.authorize (C:\Users\randy\node_modules\socket.io\lib\namespace.js:252:5)
at SocketNamespace.handlePacket (C:\Users\randy\node_modules\socket.io\lib\namespace.js:302:14)
at Manager.handleClient (C:\Users\randy\node_modules\socket.io\lib\manager.js:698:32)
at Manager.handleUpgrade (C:\Users\randy\node_modules\socket.io\lib\manager.js:618:8)
16行目:
children[0].send('server', socket);