6

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

我究竟做错了什么?

4

2 回答 2

9

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

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

故事的道德启示

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

于 2012-07-26T10:50:08.033 回答
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

于 2012-07-25T18:42:26.957 回答