シンプルな 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