【问题标题】:Socket.io and modern browsers aren't workingSocket.io 和现代浏览器不工作
【发布时间】:2012-07-23 21:39:46
【问题描述】:

我在使用 socket.io 和现代浏览器时遇到了一些奇怪的问题。令人惊讶的是,使用 IE9 可以正常工作,因为回退到 flashsocket 似乎效果更好。

在我的服务器中(使用快递)

var io = socketio.listen(server.listen(8080));
io.configure('production', function(){
    console.log("Server in production mode");
    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag');          // apply etag caching logic based on version number
    io.enable('browser client gzip');          // gzip the file
    io.set('log level', 1);                    // reduce logging
    io.set('transports', [                     // enable all transports (optional if you want flashsocket)
        'websocket'
        , 'flashsocket'
        , 'htmlfile'
        , 'xhr-polling'
        , 'jsonp-polling'
    ]);
});

在浏览器上,我可以在“网络”选项卡(在 Chrome 上)看到一个 websocket 已建立,并以待定模式进入101 Switching Protocols。之后出现xhr-polling和jsonp-polling(flashsocket怎么了?)

最糟糕的是,信息不会来回传递。我有这个连接:

io.sockets.on('connection', function (socket) {
    // If someone new comes, it will notified of the current status of the application
    console.log('Someone connected');
    app.sendCurrentStatus(socket.id);
    io.sockets.emit('currentStatus', {'connected': true);
});

在客户端:

socket.on('currentStatus', function (data){ console.log(data) });

但是我只有在关闭服务器时才能看到该日志,该服务器是通过以下方式启动的:

NODE_ENV=production node server.js

我做错了什么?

【问题讨论】:

  • 在客户端,你是先用 var socket = io.connect(); ?
  • 如果我没有连接,网络选项卡中将不可用也不可见。
  • 此外,大多数 PAAS 托管公司不支持 Web 套接字。当应用程序在本地运行并且仅不适用于生产部署时,这是否有效?
  • 它自托管在我安装的我公司的服务器上,我需要在服务器上安装一些特殊的东西吗?

标签: node.js websocket socket.io


【解决方案1】:

最后,在我的头撞到墙上之后,我决定在几个环境中进行测试,看看是否是防火墙问题,因为机器落后于几个。

事实证明,除了我之外没有人遇到问题,所以我检查了防病毒软件(Trend Micro),禁用后,Chrome/Firefox 能够发挥它们的魔力。

故事的寓意

除了这里所说的 - Socket.IO and firewall software - 每当您遇到互联网上似乎没有人遇到的问题(即,未登录 github 或 socket.io 组)时,这可能是由您的防病毒软件引起的。他们是邪恶的。有时。

【讨论】:

  • 文章的死链接
【解决方案2】:

您应该让 socketio 监听应用程序本身。
另外,我从来不需要用你正在做的套接字来做所有的服务器端配置——socket.io 应该在大多数浏览器上开箱即用,而无需这样做。我会先尝试而不进行配置。 此外,在服务器上,您应该从传递给回调函数的套接字发出,而不是执行 io.sockets.on。

var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  // If someone new comes, it will notified of the current status of the application
  console.log('Someone connected');
  app.sendCurrentStatus(socket.id);
  socket.emit('currentStatus', {'connected': true);
});

在客户端,你需要先连接:

var socket = io.connect();
socket.on('currentStatus', function (data){ console.log(data) });

如果您想查看使用 socket.io 进行双向通信的示例,请查看我的 Nodio 应用程序。

服务器端: https://github.com/oveddan/Nodio/blob/master/lib/Utils.js

和客户端: https://github.com/oveddan/Nodio/blob/master/public/javascripts/Instruments.js

【讨论】:

  • 嗨 Oved,我正在制作的配置是 socket.io 在生产中推荐的,我已经尝试过不使用该配置。你说的对我来说毫无意义,因为,真的,io.sockets.on 就是它在 socket.io 网络上所说的,除了它确实在 IE 上工作
  • 关于 io.sockets.on 你是对的,我会更新我的答案。在这种情况下,仍然尝试在回调中使用 socket.emit 而不是 io.sockets.emit
  • 你说的没用。它确实由套接字发出,但不会发送到连接的那个……直到我关闭服务器。
  • 原来是杀毒问题!
  • AHHHHH 阻塞端口的乐趣 :) 将您的问题标记为答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2021-05-10
  • 2015-03-11
  • 1970-01-01
  • 2018-10-29
  • 2016-05-12
相关资源
最近更新 更多