2

シンプルな Node socket.io サーバーと 2 つのシンプルな Node socket.io クライアントを構築しました。各クライアントはサーバーに接続し、1 つの要求を送信し、応答を待って、それを出力します。問題は、各クライアントが自分の応答だけでなく、他のクライアントの応答も取得するため、各応答が 2 回出力されることです。なんで?

サーバーコードは次のとおりです。

var io = require('socket.io').listen(10001);
io.sockets.on('connection', function (socket) {
  socket.on('echo', function (data) {
    console.log("got request to echo "+data);
    socket.emit("echoes", data+" "+data);
  });
});

クライアントコードは次のとおりです。

var socketioclient = require('socket.io-client');
var socket1 = socketioclient.connect(HOST, {port: PORT}); 
var socket2 = socketioclient.connect(HOST, {port: PORT});

socket1.on('connect', function () { console.log("socket1 connected!"); });
socket2.on('connect', function () { console.log("socket2 connected!"); });

socket1.on('echoes', function (result) { console.log("socket1 received: "+result);  });
socket2.on('echoes', function (result) { console.log("socket2 received: "+result);  });

socket1.emit('echo', "aaa");
socket2.emit('echo', "bbb");

クライアント出力は次のとおりです。

socket1 connected!
socket2 connected!
socket1 received: aaa aaa
socket2 received: aaa aaa
socket1 received: bbb bbb
socket2 received: bbb bbb

そして、ここにサーバーログがあります:

   info  - socket.io started
   debug - client authorized
   info  - handshake authorized niJGX0EXWvLPw2THZOeD
   debug - setting request GET /socket.io/1/websocket/niJGX0EXWvLPw2THZOeD
   debug - set heartbeat interval for client niJGX0EXWvLPw2THZOeD
   debug - client authorized for 
   debug - websocket writing 1::
got request to echo aaa
   debug - websocket writing 5:::{"name":"echoes","args":["aaa aaa"]}
got request to echo bbb
   debug - websocket writing 5:::{"name":"echoes","args":["bbb bbb"]}
   debug - emitting heartbeat for client niJGX0EXWvLPw2THZOeD
   debug - websocket writing 2::
   debug - set heartbeat timeout for client niJGX0EXWvLPw2THZOeD
   debug - got heartbeat packet
   debug - cleared heartbeat timeout for client niJGX0EXWvLPw2THZOeD
   debug - set heartbeat interval for client niJGX0EXWvLPw2THZOeD
   debug - emitting heartbeat for client niJGX0EXWvLPw2THZOeD
   debug - websocket writing 2::
   debug - set heartbeat timeout for client niJGX0EXWvLPw2THZOeD
4

1 に答える 1

3

デフォルトでは、socket.ioクライアントは同じクライアントから同じホスト/ポート ( doc ) への既存の接続を再利用します。force new connection次のオプションを使用して、この動作を無効にすることができます。

// client.js
var socket1 = socketioclient.connect(HOST, {port: PORT, 'force new connection': true });
var socket2 = socketioclient.connect(HOST, {port: PORT, 'force new connection': true });
于 2013-05-05T11:41:02.777 に答える