为什么socket.io会出现这个错误?

时间:2014-02-28 08:03:14

标签: websocket socket.io

我正面临着一个问题,这个问题在那之前是不存在的,一切都在发生,因为它应该是昨天。但今天我突然看到socket.io在控制台上显示此错误

failed:Connection closed before receiving a handshake response

有人知道是什么原因吗?

在Serverside

socket.on('initUser',function(udata){
   //doing some work
   socket.emit('message',{userId:user.id});
});

在ClientSide上

socket.on('connect',function () {
   socket.emit('initUser',{data:udata});
});
socket.on('message', function (data) {
  //doing ui task on returned data
});

先谢谢

1 个答案:

答案 0 :(得分:3)

似乎这是由最新版本的Apache(> = 2.4)中的一个错误导致的,当使用ProxyPass(反向)代理WebSocket连接到上游服务器时。我在mailing list阅读了有关此事件的更多信息,但我没有找到关于为什么Apache拒绝 - 看似随机连接的进一步解释。

当我尝试通过Apache连接到Tornado WebSocket应用程序时,我在随机时间处理同样的问题,并且Apache错误和访问日志中没有任何关于此的信息。

我解决这个问题的方法

由于我找不到使后端安全失败的方法,我决定使用JavaScript在前端解决问题。所以我在我的WebSocket对象中添加了一个属性connected,默认情况下为false,并在连接打开时设置为true。然后我在close事件上添加了一个事件处理程序,如果它从未建立,则会重试连接。

代码示例

var sock; 

function connect () {
  sock = new WebSocket('ws://myhost');

  sock.connected = false;

  sock.addEventListener('open', function () {
    this.connected = true;
  });

  sock.addEventListener('close', function () {
    if (!this.connected) {
      connect();
    }
  });

}

connect();

我希望这对你有所帮助。