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