【问题标题】:Is Google Chrome supporting socket.io?谷歌浏览器是否支持 socket.io?
【发布时间】:2011-11-13 05:59:08
【问题描述】:

我正在笔记本电脑上使用 node.js 和 socket.io 制作一个小型多人游戏。有时,当我想测试一些多人游戏功能时,我会使用我的 PC 登录游戏(PC 和笔记本电脑连接到 LAN 网络)。 Socket.io 连接到我路由器的 IP (196. ...) 和端口 8080。直到今天一切正常,当我只是想在更改任何内容之前看看它是如何工作的 - 突然它没有。我首先在笔记本电脑上打开 Google 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 时,什么也没有发生。我注意到服务器记录的消息类似于:

设置请求 GET /socket.io/1/websocket/

但是 xhr-polling 比 websocket 更频繁。这就是我目前所知道的,而且在 Firefox 上一切正常,所以我认为这是 Google Chrome 的问题。

我尝试从 PC 登录时的服务器日志:

调试 - 提供静态 /socket.io.js 调试 - 客户端授权
信息 - 握手授权 30836340583773206
调试 - 设置请求 GET /socket.io/1/websocket/30836340583773206
调试 - 为客户端 30836340583773206 设置心跳间隔
调试 - 客户端授权
调试 - 设置请求 GET /socket.io/1/xhr-polling/30836340583773206?t=1315509666877
调试 - 设置轮询超时
调试 - 丢弃传输
调试 - 清除客户端 30836340583773206 的心跳间隔
调试 - 提供静态 /socket.io.js

【问题讨论】:

  • 您使用的是哪个版本的 Socket.IO,它们在客户端和服务器端是否匹配?
  • 另外,您的 Mac 上的 Chrome 版本是什么,PC 上的版本是什么?我知道有一个新版本的网络套接字协议即将推出
  • 您使用的是哪个版本的 Chrome,您使用的是哪个版本的 Socket.IO? Chrome 最近在 Chrome 14 (updates.html5rocks.com/2011/08/…) 中更新了它的 websocket 协议版本。好消息是最新版本的 SocketIO 确实支持这个新协议。
  • 在我的笔记本电脑(Linux)13.0.782.220 上两者都是一样的。 Socket.io 是最新版本。我不明白它们在服务器和客户端上有何不同,服务器将其发送给客户端(我认为)!
  • 感谢您提供更多信息。不过,我的想法很新鲜。如果 SO 上没有其他人为您提供任何东西,您可以考虑将其带到 Socket.IO 谷歌组。开发人员对那里的响应相当好。如果您确实弄明白了,请务必在此处回帖(作为您自己问题的答案)

标签: javascript google-chrome node.js websocket socket.io


【解决方案1】:

我刚刚完全遇到了同样的问题。

我可以握手并通过 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

【讨论】:

  • 谢谢!虽然,它开始工作时和停止时一样随机......现在一切都很酷。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2018-10-08
  • 2014-10-05
  • 2011-12-12
  • 2011-09-07
  • 1970-01-01
相关资源
最近更新 更多