4

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 のバグですか、それとも私のスクリプトに何か問題がありますか?

4

1 に答える 1

3

さらにおかしなことに、開発ツール (F12) をオンにすると、IE ですべてが正常に機能します。

まったくクレイジーではありません。console開発ツールを開くまで、Internet Explorer にはオブジェクトがありません(console.logコードをブロックする例外をスローします)。console.logすべての行を削除して、機能するかどうかを確認します。スクリプトをデバッグする場合は、独自のカスタム デバッグ ツールを作成する必要があります。簡単な例を次に示します。

window.debug = function() {
    if (window.console && window.console.log) {
        window.console.log.apply( window.console, arguments );
    }
}
debug("JSON-parse error!");

動作するかどうかお知らせください。

于 2012-08-22T21:01:50.653 に答える