NodeJS と Socket.IO を使用して、サーバーとクライアント間の永続的な接続を実装しています。Socket.IO サーバー自体は、着信メッセージを処理し、結果を NodeJS に送り返す別の PHP サーバーに接続します。そこで、メッセージが少し変更され、クライアントに送り返されます。
これまでのところ、すべてが正常に機能しています。Chrome、Firefox、および Opera はネイティブの WebSocket を使用しており、すべてのメッセージが正しく受信されます。
ただし、Internet Explorer と Iceweasel は XHR ポーリング フォールバックを使用しており、これは少し奇妙な動作をします... クライアントはちょうど 2 つのメッセージを受信します。この後、クライアントはサーバーにメッセージを送信できますが、クライアントにメッセージは返されません。XHR クライアントから送信されたメッセージは正しく受信され、処理されます。すべてのWebsocketクライアントが送信されたメッセージを取得します。
Socket.IO で loglevel 3 を使用すると、次の出力が得られます。
debug: clearing poll timeout
debug: xhr-polling writing 5:::{"message":"..."}
debug: set close timeout for client VjrHOXHjjg76bD_qx46C
debug: setting request GET /socket.io/1/xhr-polling/VjrHOXHjjg76bD_qx46C?t=1345663246573
debug: setting poll timeout
debug: clearing poll timeout
debug: xhr-polling writing �262�5:::{"message":"another message ..."}�200�5:::{"message":"message #3 ..."}
debug: set close timeout for client VjrHOXHjjg76bD_qx46C
debug: discarding transport
debug: cleared close timeout for client VjrHOXHjjg76bD_qx46C
最初のメッセージ (ログ行 #2) は XHR クライアントによって受信されますが、行 #7 のメッセージは消えます。行番号 7 の特殊文字にも気付きましたが、それらがバグの原因であるかどうかはわかりません。
サーバーにメッセージを送信すると、デバッグ出力は次のようになります。
debug - xhr-polling received data packet 5:::{"message":"input by the client"}
このメッセージも XHR クライアントに送り返されませんが、接続されているすべての websocket クライアントがそれを受信します。
さらにおかしなことに、開発ツール (F12) をオンにすると、IE ですべてが正常に機能します。
PHP サーバー自体に接続する NodeJS クライアントは非常に単純です (simpletcp ライブラリーを使用)。
// Client is the simpletcp-client
client.on("data", function(data) {
var msgData;
try {
msgData = JSON.parse(data.toString("utf8"));
} catch(e) {
console.log("JSON-parse error!");
return;
}
var socket = getsock(msgData.sid); // msgData.sid is the socket.id to identify the socket
if(socket == null) {
console.log("Client not found!");
return;
}
socket.emit("message", { "message" : msgData.message });
});
私が今尋ねていること - これは Socket.IO のバグですか、それとも私のスクリプトに何か問題がありますか?