在IE中使用XHR轮询的Socket.IO

4
我正在使用NodeJS和Socket.IO来实现服务器与客户端之间的持久连接。 Socket.IO服务器本身连接到另一个处理传入消息并将结果发送回NodeJS的PHP服务器。然后,稍微修改消息并将其发送回客户端。
到目前为止,一切都很顺利。 Chrome,Firefox和Opera都使用本地WebSockets,并且所有消息都被正确接收。
然而,Internet Explorer和Iceweasel使用XHR-polling回退,行为有些奇怪...客户端恰好收到两条消息,之后客户端可以向服务器发送消息,但是没有消息被发送回客户端。从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客户端都会收到它。

更疯狂的是,如果我打开IE的开发工具(F12),一切都能正常工作。

连接到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的bug还是我的脚本有问题?

1个回答

3
让事情变得更加疯狂的是,如果我打开开发工具(F12),在IE中一切都正常运行。
这并不奇怪。在打开开发工具之前,Internet Explorer没有console对象(console.log会抛出异常,阻塞代码)。请删除所有console.log行并查看是否有效。如果您想调试脚本,则应编写自己的自定义调试工具。以下是一个简单的示例:
window.debug = function() {
    if (window.console && window.console.log) {
        window.console.log.apply( window.console, arguments );
    }
}
debug("JSON-parse error!");

请告诉我们它是否有效。


我甚至想要实现某种调试机制,但是想先进行一些测试...看来这就是拖延工作的结果。非常感谢,这解决了问题! - lukew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接