当前位置 : 主页 > 网页制作 > Nodejs >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
我正在使用NodeJS和Socket.IO来实现我的服务器和客户端之间的持久连接. Socket.IO服务器本身连接到另一个处理传入消息的 PHP服务器,并将结果发送回NodeJS.在那里,消息被稍微修改并发送回客
我正在使用NodeJS和Socket.IO来实现我的服务器和客户端之间的持久连接. Socket.IO服务器本身连接到另一个处理传入消息的 PHP服务器,并将结果发送回NodeJS.在那里,消息被稍微修改并发送回客户端.

到目前为止,一切正常. Chrome,Firefox和Opera正在使用本机websockets,并且所有消息都已正确接收.

但是,Internet Explorer和Iceweasel正在使用XHR轮询回退,它表现得有些奇怪……客户端正好收到两条消息,之后客户端可以向服务器发送消息,但没有消息被发送回客户端.从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-client都会收到它.

为了让事情变得更加疯狂,如果我打开开发工具(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错误还是我脚本中的错误?

To make things even more crazy, everything works fine in IE if I turn
on the development tools (F12).

根本不疯狂.在打开开发工具之前,Internet Explorer没有控制台对象(console.log会抛出阻止代码的异常).删除所有console.log行,看看它是否有效.如果您想调试脚本,那么您应该编写自己的自定义debuging工具.这是一个简单的例子:

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

如果有效,请告诉我们.

网友评论