node.js和socket.io。 websocket的传输类型配置?

时间:2013-01-15 08:43:25

标签: javascript node.js websocket socket.io

  

这个问题涉及socket.io版本< 0.9.x.   较新版本具有不同的传输方式和设置传输的方法。

我在两周内测试节点js和socket.io。当我开始时,我从客户端的socket.send(message)函数中得到问题。我无法向服务器发送任何消息。但我仍然可以从服务器接收消息。当我找到服务器端的配置传输时,我解决了这个问题:

socket.set('transports',[
   'xhr-polling'
  , 'jsonp-polling'
]);

一切都很好。现在我也可以向服务器发送消息。但我仍然有一个问题,为什么我必须配置传输。默认socket.io使用websocket传输设置,如下所示:

socket.set('transports', [
    'websocket'
  , 'flashsocket'
  , 'htmlfile'
  , 'xhr-polling'
  , 'jsonp-polling'
]);

所以它首先使用websocket,而不是xhr-polling。但是,使用socket.send(msg)甚至socket.emit(...)时,服务器无法接收客户端发送的任何消息。

所以问题是:什么不支持websocket这里?浏览器或node.js ...我很抱歉,但我从谷歌搜索了这么多页面,我还没有找到答案。

我使用node.js版本0.8.16,socket.io版本0.9.13和最新的浏览器:chrome,firefox,opera

我想使用websocket而不是xhr-polling。

1 个答案:

答案 0 :(得分:5)

这很奇怪,因为即使您的服务器配置不支持websockets,socket.io也会选择下一个最佳可用方法(在您的情况下为xhr-polling)。实际上,您甚至不需要设置这些传输,因为socket.io将默认使用'websocket'作为主要方法。这可能表明其他一些问题,可能是您的代码?

什么不支持websockets绝对不是你正在使用的浏览器,当然也不是node.js。这取决于您的服务器设置。

首先检查:

  1. 您正在收听的端口已在防火墙中打开
  2. 您的网络服务器支持websockets。如果您正在使用Apache并将您的请求代理到内部IP:PORT,除非您安装apache-websocketpywebsocket
  3. 之类的内容,否则websocket将无效

    最终解决了我的问题是在端口80上禁用Apache侦听并让node.js侦听该端口。以下是SO帮助我的答案:https://stackoverflow.com/a/7640966/2347777