Socket.io和现代浏览器无法正常工作

时间:2012-07-25 12:45:19

标签: node.js websocket socket.io

我在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

我做错了什么?

2 个答案:

答案 0 :(得分:9)

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

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

故事的道德

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

答案 1 :(得分:1)

你应该只是让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