我正在笔记本电脑上使用node.js和socket.io制作小型多人游戏。偶尔,当我想测试一些多人游戏功能时,我使用我的PC登录游戏(PC和笔记本电脑连接到LAN网络)。 Socket.io连接到我的路由器的IP(196. ...)和端口8080.一切都运行良好,直到今天,当我只是想在我改变任何东西之前看看它是如何工作的 - 突然间它没有。我首先在笔记本电脑上打开谷歌浏览器并登录,运行正常。然后,我在我的电脑上打开谷歌Chrome并试图连接,但它没有用。首先,用户在表单中输入他的名字和密码,然后单击一个登录按钮,该按钮调用此功能:
login = function()
{
var n = document.forms['logn']['name'].value;
var p = document.forms['logn']['password'].value;
var socket = io.connect("http://192.168.0.13:8080");
socket.emit("login", {n: n, p: p});
socket.on("got", function(data){
if (data.good)
{
main(socket, n)
}
else
{
alert("Failed to log in.");
}
});
}
当我调用函数时,没有任何反应。我注意到服务器记录的消息类似于:
设置请求GET /socket.io/1/websocket /
但xhr-polling比websocket更常见。这就是我现在所知道的,而且,Firefox上的一切正常,所以我认为这是谷歌Chrome的一个问题。
当我尝试从PC登录时服务器日志:
debug - 服务静态/socket.io.js调试 - 客户端授权
info - 握手授权30836340583773206
debug - 设置请求GET /socket.io/1/websocket/30836340583773206
debug - 为客户端设置心跳间隔30836340583773206
调试 - 授权的客户 调试 - 设置请求GET /socket.io/1/xhr-polling/30836340583773206?t=1315509666877
debug - 设置轮询超时
调试 - 丢弃运输
debug - 清除客户端的心跳间隔30836340583773206
debug - 服务静态/socket.io.js
答案 0 :(得分:5)
我只是完全同样的问题。
我可以通过Chrome进行握手和身份验证,但是客户端上没有正确处理任何发送(尽管Socket.io正在发送它们)。
登录您的服务器并更新socket.io。
$> npm ls
将告诉您已安装模块的最新版本。在我的实例中,我正在运行:
/var/www/discovery/node
├─┬ express@2.4.6
│ ├── connect@1.6.2
│ ├── mime@1.2.2
│ └── qs@0.3.1
├── iniparser@1.0.3
├── jsonrpc@0.1.1
├── jsonrpc-ws@0.0.3
├── jsonrpc2@0.0.6
├─┬ mysql@0.9.3
│ └─┬ hashish@0.0.4
│ └── traverse@0.5.1
└─┬ socket.io@0.7.9
├── policyfile@0.0.4
├── redis@0.6.6
└─┬ socket.io-client@0.7.9
├── uglify-js@1.0.6
├── websocket-client@1.0.0
└── xmlhttprequest@1.2.2
你可以看到socket.io@0.7.9已经过时了。这也意味着它没有最新的ws:// websocket协议更新。
所以为了解决它,只需运行:
$> npm update socket.io express