Socket.io: 升级后不明原因断开“传输结束”

创建于 2012-03-03  ·  73评论  ·  资料来源: socketio/socket.io

在今天向我的 package.json 添加依赖项后,我删除了我的 node_modules 并运行了 npm_install。 我没有为 socket.io 指定任何版本号,所以我猜它是最新的。

在我这样做之后,我注意到了? 启动我的应用程序一分钟左右,我的套接字将断开连接,我在 node.js 控制台输出中看到“传输结束”信息消息。 我只为 websockets 设置了 socket.io。 我在 Linux 上使用 Chrome 13。

我进入 package.json 并将其设置为 0.8.7,再次运行 npm install,现在我不再看到断开连接了。

希望我不只是对某些事情感到困惑。 我确实回去重复了这些步骤并得到了相同的结果。 抱歉,我没有更具体的信息。

所有73条评论

0.9.1 可能引入了心跳触发过早断开连接的错误。
我正在研究它,明天可能会有 0.9.2

同上。 在 Mac 上的 Chrome 和 FF、同一台机器上的客户端和服务器中看到重复断开/重新连接。
从自述文件中的 socket.io 示例中很容易看到,默认设置不变。

有同样的问题......我还注意到,在套接字断开连接后立即实例化了一个新的套接字。

我的解决方法是手动设置关闭超时:

io.configure( function() {
    io.set('close timeout', 60*60*24); // 24h time out
});

我也遇到了这个问题。 感谢 steffenwt 的解决方法。

是的,我也有这个错误。 几天前我开始学习socket.io,一开始我以为我做错了什么。

降级到 0.9.0 有效。

不确定是否相关,但套接字会在每隔一个心跳时关闭。 所以它是这样的

heartbeat2 gets sent and recieved all fine
heartbeat3 gets sens but never gets recieved
disconnect

在这里登录:

   debug - emitting heartbeat for client 18615332192056708826
   debug - websocket writing 2::
   debug - set heartbeat timeout for client 18615332192056708826
   info  - transport end
   debug - set close timeout for client 18615332192056708826
   debug - cleared close timeout for client 18615332192056708826
   debug - cleared heartbeat timeout for client 18615332192056708826
   debug - discarding transport

我也有这个问题。

我使用 0.91-1 。

我试过了,但是有这个问题。

io.configure(函数(){
io.set('关闭超时', 60_60_24); // 24 小时超时
});

同样的问题在这里

你降级到 0.9.0 了吗? 我现在在 NPM 上将其标记为最新

0.9.1-1 也有同样的问题,juste 降级到 0.9.0,问题就解决了。

作为一种解决方法,您可以从客户端发送一些 keep-alives,例如 20 秒,并立即从服务器回答那些:

客户端:setInterval(function() { socket.emit("keep-alive", null) },20*1000);
服务器:socket.on('keep-alive', function (data) { socket.emit('keep-alive', null); });

FWIW:如果您从不同的服务器为客户端提供服务,并且您的客户端代码没有降级到 0.9.0,那么您仍然会看到问题。

我将“socket.io”降级到 0.9.0,但我仍然看到了问题。 然后我将 socket.io-client 降级到 0.9.0 并且我没有断开连接。

此外,我尝试过的失败的传输是网络套接字和 xhr 轮询。

这个问题应该解决了吧?

我也有同样的问题。 但我注意到这是因为我有haproxy。

我的问题在这里:

frontend all 0.0.0.0:80
    default_backend www_backend
    acl is_websocket path_beg /socket.io
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_websocket hdr_beg(Host) -i ws
    timeout client 1000

就在“超时客户端 1000”行中(我将其更改为 1 秒以查看是否是问题所在,并且是...)。

所以现在我正在寻找是否有办法只为 websocket 后端更改它。

我希望这对某人有所帮助:+1:

仅供参考,我在 xhr-polling 和 0.9.14 中也看到了这个问题。 每 25 秒强制断开一次。 日志与上面相同。

我还可以验证 0.9.14 服务器和 0.9 客户端是否发生了这种情况。 尽管它不会每 25 秒断开一次连接,但它确实会间歇性地断开连接。 我追踪到一个调用 stream.emit('end'); 在 node.js 的 _stream_readable.js 中。 我认为这是在缓冲区中读取 EOF 的结果。

@citosid为什么 haproxy 客户端超时会导致这个?

发生在 0.9.16。 与 BoarK 相同

socket.io 支持死了吗?

@joefaron在它消亡之前必须有支持。 所以不,Socket.IO 支持并没有消亡,它只是从未存在过。

Socket.io 0.9.16 也有同样的问题 - 每隔约 25 秒看到连接断开,同时日志显示“正在丢弃传输”。

降级到 0.8.6 基本上解决了我的所有问题......而且我正在使用
jsonp-polling 而不是 xhr-polling 作为 websocket 的备份.. 似乎很远
更稳定。

在 2014 年 1 月 26 日星期日上午 10:16,Aran Reeks [email protected]写道:

Socket.io 0.9.16 也有同样的问题 - 每隔 ~25 就会看到连接下降
秒和日志同时显示“正在丢弃传输”。


直接回复本邮件或在Gi tHub上查看
.

@joefaron ,为您的帮助干杯。

今晚我一直在尝试不同的配置选项,明天将进一步研究它,但我可以确认问题是心跳检查失败。 这些检查已经到位,以确保仍然需要与用户的连接,并且他们不会因为任何原因而没有发送断开连接。

我已经能够在 Firefox 和当前稳定版本的 Chrome (32.0.1700.76 m) 中复制此错误。

最初,我试图完全禁用心跳,因为对于我们的应用程序,它们并不是真正需要的,这可以按如下方式完成(根据当前的文档,尽管当我尝试此操作时,它似乎删除了所有传输方法并最终不断崩溃并重新启动)。
io.set('heartbeats', false);

由于这失败了,我的下一次尝试是增加心跳请求之间的超时时间,这可以在 app.js 中使用以下内容完成:
io.set('heartbeat timeout', 99999); // 99999 being the time between requests in seconds - Default is 25, please choose your value as applicable for your applications

这对我们的应用程序是一种享受,因为我们不关心客户端断开连接,但这在您的环境中可能不是一个可行的选择。

对于遇到此问题的任何其他人,以防万一,我的环境如下:
NodeJS: v0.10.24 Socket.io: v0.9.16 Centos 6.5

我认为这是一个非常紧迫/关键的问题。 怎么还没解决? 自从这个问题线程开始以来已经过去了两年。

我也遇到这个问题:

NodeJS: v0.10.24
Socket.io: v0.9.16

d-oliveros:我强烈建议降级到 0.8.6。 我没有这个
问题.. 我不认为最新版本会在不久的将来得到修复。

2014 年 2 月 15 日星期六晚上 8:55,d-oliveros [email protected]写道:

我认为这是一个非常紧迫/关键的问题。 为什么没有
解决了吗? 自从这个问题线程开始以来已经过去了两年。

我也遇到这个问题:

NodeJS:v0.10.24
Socket.io:v0.9.16

直接回复本邮件或在Gi tHub上查看
.

请尝试新的master ,这个问题消失了。

是否会有 0.9.17 版本包含针对此问题的修复程序?

@fgnass你能用1.0.0-pre重现它吗?

@guille 到目前为止看起来不错! 如果再次发生,我会让你知道。

@guille有什么办法可以将此修复程序引入 0.9.16 吗? 只是我们在一个完善的生产环境中使用 node.js/socket.io,我将很难证明使用我们平台任何方面的预发布版本的合理性。 如果可以为 0.9.16 做一个补丁,或者如果 1.0.0 将在(非常)不久的将来发布,这将是更可取的。

+1 @eggysplat

@aran112000感谢heartbeat timeout解决方法。 在 v0.9.16 上对我有用。

其实我找到了我遇到这个问题的原因。 非常尴尬,我以为我使用的是 v0.9.16,而实际上我使用的是有该错误的 v0.9.0。 它已在 v0.9.2 中由https://github.com/LearnBoost/socket.io/commit/57a0b2406004e46ec34729392ee289191a4f78e7https://github.com/LearnBoost/socket.io/commit/df5f23d3091df9bbf2791df9bbf27991df9bbf279910004e46ec34729392ee289191a4f78e7修复

请确保您的heartbeat interval没有比 v0.9.0 中的heartbeat timeout大。

编辑帖子,以便其他人可能会意识到:

浪费了几个小时的错误跟踪,直到我决定用我的 mac 测试这个问题。 似乎我在 Windows 8 上的防病毒软件也阻止了连接并导致事情丢失。 卸载后,一切正常。

相关帖子实际上在这里,但很难找到。
https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software

我是 socket.io 的初学者,这花了我两天多的时间。 发送/接收数据后,客户端断开并重新连接,因此socket.id值发生变化

socket.io:client client close with reason transport close +39s
socket.io:socket closing socket - reason transport close +44s
.
.
.
socket.io:namespace adding socket to nsp / +4.1m
socket.io:socket socket connected - writing packet +1s

最后,我发现回调内部存在异常,因此 socket.io 会默默地断开与系统的连接并重新连接。

socket.on('someEvent', function(){
    var a = null;
    a.b; //You won't be aware of this error, this error is suppressed and won't be shown on console. 
         //Moreover, it disconnects and reconnects
})

另见此评论

因此,它会默默地捕获错误,并且不会在控制台上向我显示任何内容。 为什么它会在不通知我的情况下抑制错误并断开/重新连接?

1.3.5 错误依旧

是吗?

是的,1.3.5的问题依然存在...

问题仍然存在

是的,问题在 1.3.5 中仍然存在,请修复

我认为这是@citosid指出的 haproxy 客户端超时问题。 增加 websocket 后端的 haproxy 客户端超时,这个问题应该得到修复。

我有同样的问题,但我没有使用 haproxy。 有谁知道这个工作的最后一个版本?

好的,我也收到报告称该问题在我们的系统中并未 100% 修复。 有趣的是,我可以通过将 haproxy 中的“超时客户端 1”设置为一秒来可靠地重现该问题,并在我们的前端体验该错误。

受此提示,我将“超时客户端”增加到更大的数字,并认为问题会消失,因为 socket.io keepalive / heartbeat 将有足够的时间来刷新连接。 这个假设很可能是错误的,如果我发现更多事情,我会通知你们。

我在stackoverflow帖子上发布了这个,对于你们中的一些人来说这可能会解决它:
“看起来 HackTimer.js 和 ccapture.js 都用自定义函数替换了 window.setTimeout。如果 HackTimer.js 在任何其他 JavaScript 之前执行,它似乎可以正常工作。对于 ccapture.js,你可能想确保它是作为第一个脚本运行。因此,SocketIO 首先使用浏览器的本机 setTimeout,然后被自定义的 setTimeout 吹走,这会破坏当前正在运行的任何计时器。”

搜索您的代码以查看您的库之一是否正在替换它:

ag 'window.setTimeout\s*='

您还可以在控制台中测试以查看 setTimeout 是否已被修改:

/native/.test(window.setTimeout) // returns true for the native function and false for a custom one

这个bug还存在吗? 我升级到主版本,任何移动设备在大约 2 分钟内断开连接,并收到运输关闭通知。

这就是它远离 socket.io 1 > 并使我继续使用 socket.io 0.9.17 的原因。 但现在我再次尝试,在服务器上手动设置一个乒乓球以使其保持活动状态,现在在 19 分钟后断开连接..间隔是每 35 秒..

如果我运行 socket.io 0.9.17 这个问题不存在..但我不想再使用它,因为它已被弃用。 任何帮助,这发生在移动设备的浏览器中。

@utan复制步骤是什么?

@rauchg

感谢您的回复..

1)安装socket.io 1.4.0
2)将nginx配置设置为代理

                        proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $host;
                proxy_http_version 1.1;
                proxy_pass http://io_nodes;

3) 使用 socket.io 1.4.0 / 2015-11-28 设置你的客户端
4) 在移动设备中连接..
5) 让手机浏览器连接到你的应用程序,然后让你的手机闲置。

然后记录;

  engine:polling compressing +0ms
  engine:socket executing batch send callback +1ms
PuTTY  engine intercepting request for path "/socket.io/" +95ms
  engine handling "GET" http request "/socket.io/?EIO=3&transport=polling&t=L8YVUt6&sid=DJNvvkhmCQew_3vGAAAB" +0ms
  engine setting new request for existing client +0ms
  engine:polling setting request +0ms
  engine:socket transport error +6s
  engine:polling closing +2ms
  engine:polling transport writable - closing right away +0ms
  engine:polling writing "�1" +0ms
  socket.io:client client close with reason transport error +0ms
  socket.io:socket closing socket - reason transport error +0ms

您在 3 4 分钟后断开连接..

如果使用轮询,你会得到这个错误日志;

 engine:socket executing batch send callback +1ms
PuTTY  engine intercepting request for path "/socket.io/" +106ms
  engine handling "GET" http request "/socket.io/?EIO=3&transport=polling&t=L8YXgi6&sid=skadf3It4qBRi0S0AAAC" +1ms
  engine setting new request for existing client +0ms
  engine:polling setting request +0ms
  engine:socket transport error +3s
  engine:polling closing +0ms
  engine:polling transport writable - closing right away +0ms
  engine:polling writing "�1" +0ms
  socket.io:client client close with reason transport error +1ms
  socket.io:socket closing socket - reason transport error +2ms
  engine intercepting request for path "/socket.io/" +373ms
  engine handling "POST" http request "/socket.io/?EIO=3&transport=polling&t=L8YXhdB&sid=skadf3It4qBRi0S0AAAC" +0ms

所以@rauchg关闭了吗?

真的不认为你应该。

我没有。

@rauchg
那么这是 socket.io 现在的正常行为吗? WS 协议中是否有什么变化,如果移动设备中的用户没有插入并且他们闲置,现在他们会断开用户的连接?

我正在用这个问题撞墙,它不会让我完成升级......并使用新的socket.io重构我的代码......
我的服务器 Ubuntu 10.10
Nginx 版本:Nginx/1.8.0
Node v0.10.31 // 如果我升级到 4.0 也是一样的..

使用 https 和 Nginx 代理 socket.io ..

有没有其他人有同样的问题,还是只有我有同样的问题?

我想我也可能......虽然很难查明我的情况。 我正在使用带有 socket.io 的sails.js。

Ubuntu 14.04
节点 v5.3.0
npm v 3.3.12
帆。 [email protected]
socket.io@~1.4.3

我的客户端是 socket.io-client 和 Sails.io.js 的混合体:

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');
var io = sailsIOClient(socketIOClient);
io.socket.on('connect', function(data){....})

所以初始连接永远持续......但是在 .emit() 或 .broadcast() 到这个客户端之后,服务器在大约 25 秒到 1 分钟后转储客户端并且......客户端没有收到断开连接的通知. 它认为它仍然连接。

非常令人沮丧。

我遇到了类似的问题,但前提是我使用安全套接字(wss 而不是 ws)。 使用 ws 一切正常,但使用 wss 时,连接会在随机时间(~15 分钟)偶尔掉线。 没有防火墙,没有代理。

谢谢@andrin-n-dream 我认为我的也与 SSL 有关。 我有一台 Windows 机器作为客户端,我的 ubuntu vm(同一台机器)作为服务器。 桥接网络适配器。 一般网络连接从来没有任何问题。

无论我使用 nginx SSL 还是sails.js SSL 终止,都会发生在 SSL 上。

NAVER - http://www.naver.com/

电子邮件发送至


收件人已阻止接收您的电子邮件。


我一直调试,找不到 SSL 的其他解决方案,只能手动重新连接。 如果 engine.io 能为我做这件事并在传输关闭时重试,那就太好了。

有解决方案吗? 我有完全相同的问题。 几秒钟后,我在服务器的调试日志中收到心跳超时,但客户端仍然认为它已连接。

好吧,由于其他紧迫的问题,我已经升级了我的 env,现在这个问题被搁置了。 很高兴看到节点 6.5.0 有什么不同。 Sails.js 更新了一些包并改变了它对这些低级函数的使用......

我现在没有时间再次深入研究这个问题,因为我正在迁移大量遗留 C++。 也许今年晚些时候或一月。

这仍然发生在 2.0.3 ...
https://github.com/socketio/socket.io/issues/3025

如果没有解决方法,socket.io 基本上无法使用,因为 25% 的客户会遇到这个问题。

io.set('心跳超时', 99999);

@Aaron1011这是服务器端代码还是客户端代码? 如果是服务器端,客户端是否需要更改任何内容?

尝试过:
io.set('心跳超时', 99999);
在服务器端并没有使用 socket.io v 2.0.3 解决问题。 接下来要尝试降级到 0.8.6。

无法降级到 0.8.6,因为它确实是一个巨大的兔子洞。 所有的语法都发生了变化,因为我在 0.8.6 上找不到任何文档,所以这是一个失败的原因。 我真的不想重写我的应用程序以降级到旧版本,希望它可以解决这个问题。

有没有人对 v2.03 有任何想法/修复? 我尝试过的事情:

  • 将 pingInterval 设置为 9999999
  • 将 pingTimeout 设置为 99999999
  • 自动发送消息作为保持活动状态。 我每 1 秒发送一条消息,但仍然会随机断开连接。
  • 禁用防火墙
  • 尝试打开/关闭 XHR 轮询
  • 将端口从随机更改为 80

我很肯定这不是编码错误,而是 PC 特定的,因为它发生在某些而不是其他上。 它可能与网络适配器有关。

@forgeableSun你应该基于 Primus 编写你的应用程序,我用 primus 重构了我的应用程序,目前正在使用 socketJs。

支持其他一些项目,无需更改其他代码即可使用任何其他实时项目..

问候。

@utan我很想试试。 但我究竟如何用一行代码从 socket.io 切换? 似乎没有任何关于从其他框架切换的示例。

npm install browserchannel --save

var primus = new Primus(server, {transformer: 'browserchannel' });

https://github.com/primus/primus/blob/master/README.md#supported -real-time-frameworks

希望有所帮助。

浏览器频道与 socket.io 有什么关系?

这只是如何切换到不同框架的示例。

正如你要求的一个例子..

好的,但是 socket.io 甚至没有被列为受支持的实时框架之一。 切换 API 绝不仅仅是 1 行代码,我不知道文档如何在不提供任何示例的情况下进行宣传。

听着,socket.io 在 >= 1 之后有问题,它有奇怪的断开连接,我建议使用 primus 以便您可以切换到不同的框架..

这就是为什么我给了你一个例子,当然你需要重构代码来使用 primus 然后你可以自由地尝试不同的框架来看看哪个最适合你,或者如果一个坏了那么你使用不同的框架..

问候

@utan我明白了,我认为它是一个转换器,用于从一个框架切换到另一个框架,整个应用程序都是在该框架中编写的(如适配器)。 但实际上,它是一个转换器,用于无缝切换到框架,整个应用程序都是用 primus 编写的。

确实,你抬起头来……我不知道其中的区别,还以为我们在谈论同一件事……

问候。

我的服务器日志:
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”
客户端断开。 断开原因:“传输关闭”

切换到 ws (https://github.com/websockets/ws),其中涉及大量重写,但我现在在客户端使用本机 websocket 浏览器对象,一切正常。 我不再有这个问题。 这么长的socket.io!

我在 10 到 30 分钟后随机断开连接。 我记得我的托管服务在 Apache 共享服务器上使用 Passenger 运行 NodeJS。 我不太明白,但基本上在这种集成中存在 websockets 问题。 我正在测试设置传输:['polling'],而在本地主机上我使用传输:['websockets', 'polling'] 没有错误和丢失。 30 分钟后到目前为止一切顺利...

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

adammw picture adammw  ·  4评论

MyMomSaysIAmSpecial picture MyMomSaysIAmSpecial  ·  4评论

distracteddev picture distracteddev  ·  3评论

gCurtisCT picture gCurtisCT  ·  4评论

kootoopas picture kootoopas  ·  4评论