Socket.IO在IE中使用XHR轮询

我正在使用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 

XHR客户端接收到第一条消息(日志行#2),但第7行消息消失。 我也注意到第7行的特殊字符,但是我不知道他们是否对错误负责。

向服务器发送消息时,debugging输出是:

 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错误或是我的脚本中的东西是错误的?

为了让事情变得更加疯狂,如果我打开开发工具(F12),在IE中一切正常。

根本不疯狂。 Internet Explorer没有console对象,直到您打开开发工具( console.log引发阻止您的代码的exception)。 删除所有console.log行,看看它是否工作。 如果你想debugging脚本,那么你应该编写自己的自定义debugging工具。 这是一个简单的例子:

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

让我们知道它是否有效。