【问题标题】:node.js sockets.io disconnecting every ~25 seconds (heartbeat-related)node.js sockets.io 每约 25 秒断开一次(与心跳相关)
【发布时间】:2012-03-05 20:39:31
【问题描述】:

我正在尝试使用 socket.io 设置 node.js 服务器。我看到的问题是我的服务器每 25 秒断开连接并重新连接客户端。

这是我的服务器代码:

var io = require('socket.io').listen(5876);
io.sockets.on('connection', function (socket)
{
    console.log("New connection established");

    socket.on('disconnect', function()
    {
        console.log("A client has disconnected.");
    });
}

我的客户端使用 socket.io.js 分发连接。据我了解(显然不正确),我需要我的客户端每 15 秒发送一次“心跳”(“::2”消息),以防止服务器认为连接已断开并断开连接。基本上:

<script src="socket.io.js"></script>
<script>
    var socket = io.connect('http://localhost:5876');

    socket.on('connect', function(data)
    {
        console.log("Connected to server.");
        setInterval(function() { socket.emit("::2"); console.log("sent heartbeat"); }, 15000); // schedule a heartbeat for every 15 seconds
    });
</script>

但客户端仍然每 25 秒断开连接+重新连接(不包括第一个 25 秒滴答声)。

node.js 服务器控制台日志如下所示(可能已经删除了一些早期相同的连接/断开连接阶段,因为它每 25 秒回显一次):

New connection established
   debug - emitting heartbeat for client 652791160849839915
   debug - websocket writing 2::
   debug - set heartbeat timeout for client 652791160849839915
   debug - got heartbeat packet
   debug - cleared heartbeat timeout for client 652791160849839915
   debug - set heartbeat interval for client 652791160849839915
   info  - transport end
   debug - set close timeout for client 652791160849839915
   debug - cleared close timeout for client 652791160849839915
   debug - cleared heartbeat interval for client 652791160849839915
A client has disconnected.
   debug - discarding transport
   debug - client authorized
   info  - handshake authorized 5961067041159055274
   debug - setting request GET /socket.io/1/websocket/5961067041159055274
   debug - set heartbeat interval for client 5961067041159055274
   debug - client authorized for
   debug - websocket writing 1::
New connection established

如何阻止我的服务器每 25 秒断开和重新连接客户端?

【问题讨论】:

  • 据我所知,您不需要手动发送心跳数据包,因为这是由 socket.io 处理的。取出手动心跳调用后,尝试检查连接和断开事件。
  • 你解决过这个问题吗?我有确切的问题。我降级到 0.8.7 仍然是同样的问题。调试 - 客户端 3744936361854682925 触发心跳超时
  • @PranoyC 这里有一个可行的解决方法:github.com/socketio/socket.io/issues/777 除此之外,我最近一直在使用最新版本的 socket.io 并且没有遇到任何问题。跨度>
  • @Josh1billion 不幸的是,我的项目不能使用比 0.9.x 更新的任何东西,因为 1.0 改变了很多完全破坏我们项目的东西。我会看看解决方法
  • @PranoyC Dang,希望解决方法能奏效。如果没有,接下来我可能会尝试降级甚至超过 0.8.7,并希望某些旧版本没有该错误。除此之外,恐怕我不知道。

标签: node.js socket.io heartbeat


【解决方案1】:

您使用的是最新版本的 socket.io,0.9.1/0.9.1-1?如果是这样,这是 Guillermo 确认的已知问题。目前的建议是回滚到 0.9.0 或 0.8.7

https://github.com/LearnBoost/socket.io/issues/777

【讨论】:

  • 一定是这样;昨晚刚安装的,应该是最新版本吧。如何回滚到 0.9.0?我使用推荐的 npm 方法安装,如下所示:“npm install socket.io”
  • 可以指定具体版本安装:npm install socket.io@0.9.0
  • 遇到同样问题但回滚无效
  • 同样的事情,使用套接字 0.9.16 和 0.9.0,我在启动应用程序后一分钟左右得到“传输结束(心跳超时)”。使用 socketio 0.8.7,我得到了客户端的一系列调试设置/清除心跳超时。
  • 我遇到了确切的问题。我降级到 0.8.7 仍然是同样的问题。调试 - 客户端 3744936361854682925 触发心跳超时
【解决方案2】:

你不需要发送心跳来保持套接字连接,socket.emit 的语法也是

          socket.emit('event_name',{"data"});

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2013-02-09
    • 2014-03-24
    • 1970-01-01
    • 2017-08-25
    相关资源
    最近更新 更多