我正在使用 NodeJS 和 Socket.IO 来实现我的服务器和客户端之间的持久连接。Socket.IO 服务器本身连接到另一个 PHP 服务器,该服务器处理传入的消息并将结果发送回 NodeJS。在那里,消息被稍微修改并发送回客户端。
到目前为止,一切正常。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
XHR 客户端接收到第一条消息(日志行#2),但行#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 错误还是我的脚本中有问题?