Node.js Socket.io和现代浏览器不是';行不通

Node.js Socket.io和现代浏览器不是';行不通,node.js,websocket,socket.io,Node.js,Websocket,Socket.io,我对socket.io和现代浏览器有一些奇怪的问题。令人惊讶的是,IE9可以很好地工作,因为flashsocket似乎工作得更好 在我的服务器中(使用express) 在浏览器上,我可以在网络选项卡(Chrome上)中看到一个websocket已建立,并以挂起模式进入101交换协议。之后,出现xhr轮询和jsonp轮询(flashsocket发生了什么?) 最糟糕的是,信息不会来回传递。我有这个连接: io.sockets.on('connection', function (socket) {

我对socket.io和现代浏览器有一些奇怪的问题。令人惊讶的是,IE9可以很好地工作,因为flashsocket似乎工作得更好

在我的服务器中(使用express)

在浏览器上,我可以在网络选项卡(Chrome上)中看到一个websocket已建立,并以挂起模式进入
101交换协议。之后,出现xhr轮询和jsonp轮询(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

我做错了什么?

你应该让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应用程序

服务器端:

以及客户端:

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

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

故事的寓意
除了这里所说的之外——当你面对一个互联网上似乎没有人有过的问题(即,没有登录github或socket.io组)时,它可能是由你的防病毒软件引起的。他们是邪恶的。有时。

在客户机上,您是第一次使用var socket=io.connect()进行连接吗?如果我不在,网络选项卡上就没有可用的连接,也看不到连接。而且,大多数PAAS托管公司不支持web套接字。当应用程序在本地运行,但在生产部署中不起作用时,这是否起作用?它是在我安装的公司的服务器上自托管的,我需要在服务器上安装一些特殊的东西吗?您好,我正在制作的配置是socket.io在生产中推荐的配置,我已经尝试过没有该配置。你所说的对我来说毫无意义,因为实际上,
io.sockets.on
是socket.io网站上所说的,而且它在IEE上也起作用。关于io.sockets,你是对的。我会更新我的答案。在这种情况下,仍然尝试在回调中使用socket.emit,而不是io.sockets.emit您所说的不起作用。它确实通过套接字发出,但不向连接的套接字发出。。。直到我关闭服务器。这是一个防病毒问题!啊哈,阻塞端口的乐趣:)将您的问题标记为答案!这篇文章的死链接
var socket = io.connect();
socket.on('currentStatus', function (data){ console.log(data) });