Socket.io: 客户端上的持续“传输关闭”

创建于 2017-08-03  ·  48评论  ·  资料来源: socketio/socket.io

我已经设置了 socket.io v.1.4.5 w express,但我无法追踪客户端无法解释的断开连接的原因。 客户端断开连接事件给出的原因是“传输关闭”。 它在某些客户端上非常一致地发生。

对于客户端在似乎是定时间隔的情况下“传输关闭”断开连接是否有任何解释? 客户端重新连接就好了,但它会造成极大的不便,因为它发生得如此频繁。

我尝试了各种设置,例如更改 pingInterval、pingTimeout 和 websockets 的端口(我现在使用端口 80)。 但无论我似乎做什么,问题都不会消失。

最有用的评论

我在部署到谷歌云平台(GCP)后,每 30 秒遇到一次 socket.io 断开连接的问题。 结果证明这是全局负载均衡器使用的默认 http 超时。 GCP 文档说您应该在使用 websockets 时更改该值。 更改设置的说明在这里:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting

所有48条评论

更新到 socket.io v2.0.3。 并且仍然有问题。 它似乎只发生在我的一台电脑上。 我也禁用了windows防火墙,但问题仍然存在。

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

经历同样的事情。 我真的不想经历重写。 任何人在这个问题上有任何成功吗?

我真的厌倦了这个问题。
我认为你们应该用“socket.io-client”检查“socket.io”的版本。
如果服务器/客户端版本不匹配,则连接非常不稳定。

我建议只为客户端使用如下所示的 CDN。

关于这个问题的任何消息,因为我有完全相同的问题!

当我部署到 k8ns 时,我也有同样的问题,但是当我在本地运行时,它工作正常。

我也在苦恼这个...

@talas9 @muhammadnasr @htamop能够调试/重现问题的常见问题:

  • 您使用的是哪个版本的客户端/服务器?
  • 哪个浏览器?
  • 可以用小提琴重现吗?

谢谢!

我已经在 2.1.0 和 2.0.4 客户端和服务器上试过了。 在 chrome 和 safari(最新)上。
当我在本地运行时它工作正常(可以在不断开连接的情况下连接一个多小时),但是当我部署到入口负载均衡器后面的 K8ns 时,就会发生这个问题......

FYI 连接在每次 25 秒后关闭,请参阅屏幕截图

@talas9 @htamop @dnwldbs84你在使用负载均衡器吗?

@darrachequesne您建议将哪种负载均衡器与 socket.io 一起使用?

@muhammadnasr @darrachequesne
我使用了 2.1.0 服务器和 1.0.0 客户端(android)
我需要保持连接稳定 8~9 小时,但它意外断开连接。
我把两个版本都改成了 1.7.4 和 0.8.3? 根据其他解决方案帖子。 明天我会尝试测试它是否有效

我没有使用负载平衡器。 客户端和服务器都使用了 Socket.io 的 2.0.3 版本(我不记得我使用的所有版本)。 我不知道是哪个浏览器导致了问题 但是,大多数用户都使用过 Chrome。 就我而言,断开连接是随机的,因此无法重现。
然后我改成了 ws。 我不确定问题是否已解决。

@muhammadnasr @darrachequesne @dnwldbs84
我认为在我的情况下它已经解决了。
我在 android 前台服务(api 26)中使用 0.8.3 socket.io-client,在 nodejs 服务器中使用 1.3.5 版本。
但是,问题可能不是版本。
我将服务器中的 pingInterval 更改为 10ms,它似乎工作正常(没有发生 ping 超时和传输关闭)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });

10毫秒太窄了,这样网络就会不堪重负。

10毫秒就是缩小,这样网络就会不堪重负。

正确的!

@muhammadnasr任何负载平衡器都应该工作。 请参阅以下示例:

但是,如果启用轮询(这是默认设置),则需要粘性会话。

@darrachequesne我有同样的问题,大约 8~9 小时后,套接字因“传输关闭”的原因断开连接

我正在使用:

Chrome: 61.0.3163.100
Electron: 2.0.2
Socket.io: 2.1.1

有同样的问题,能够使用 CDN 从这个评论https://github.com/socketio/socket.io/issues/3025#issuecomment -329024833 修复它并设置超时和间隔,如下所示:

io.set('heartbeat timeout', 60000);
io.set('heartbeat interval', 25000);

嘿,
当 socket.io 在 Kubernetes 和 NGINX Ingress Controller 下运行时,我们也有同样的问题。
重新加载 nginx 配置时,它会重新创建进程并丢弃所有现有通信,这会导致transport close ,使用入口控制器的任何其他部署都可能导致配置重新加载

首先非常感谢这个很棒的项目。

同样的问题在这里,也许我会给你带来一些新的东西。

我在节点 js 上有一个 ws 服务器和一个 ws 客户端。
这个 ws 客户端是从一个节点 js 应用程序中使用的,其中是一个服务(微服务)。

来自 Web 浏览器(来自客户端应用程序)的其他 ws 客户端正在通过 ws 服务器与此节点 js 服务进行通信。

一切都按预期工作。

现在在压力测试中(10 个客户端正在密集询问数据),在测试结束时,当所有作业和事务都完成时,服务的连接将关闭,并显示错误“传输关闭”。 这并不总是发生。

这是服务器的配置:
ping超时:15000,
ping间隔:20000,
看起来在重载期间,某些 ping 丢失了...? 或者我不知道。
这是我应该期待的吗?

此外,使用默认配置 pingTimeout: 2000,我在压力测试中遇到了这个错误。 这也是完全出乎意料的,但假设服务器过载并且无法在 2 秒(!)内响应,我们可能会收到此错误。 但是现在使用 pingTimeout: 15000 它几乎发生了 50%,并且仅在测试结束之后。

嗯,我相信微服务应该预料到这种错误,即使它们运行在同一个局域网上,但问题是为什么会发生这种情况?

我试图创建一个小设置来重现这个问题,但我无法做到。

如何激活日志? DEBUG=socket.io* 不起作用。 尽管设置了变量,但我没有得到任何输出。

我坚信这与#2924有关。
客户端上的重新连接是由某些浏览器(safari 和 chrome)对非活动选项卡的节流计时器引起的,以节省电池电量。
这会导致来自客户端和服务器的延迟心跳消息由于 pingTimeout 而关闭连接。
增加 pingTimeout 在某种程度上有效,但我仍然在生产环境中重新连接。

当我部署到 k8ns 时,我也有同样的问题,但是当我在本地运行时,它工作正常。

@muhammadnasr在哪里可以解决 K8s 上的部署问题? 我遇到了类似的问题。

@bheema01只需确保您在代理/负载均衡器上启用了粘性会话,它应该可以工作

有同样的错误

同样的问题......当服务器端套接字端点位于负载平衡器后面时,客户端会反复连接和断开连接。 即使在配置粘性会话后,问题仍然存在。 @muhammadnasr你能解决这个问题

我见过这个错误,当线程被频繁阻塞超过 200 毫秒时。
如果这种情况经常发生,这对 socket.io _以及您的应用程序都是不利的_。
socket.io 有一个超时来检查连接的心跳。
如果超过此超时,则会关闭连接,我们会收到此错误。

@varunSabnis修复粘性会话后,一切顺利。

@dennisat我试着检查我的客户收到乒乓球包需要多长时间。 每次超过 200 毫秒时,都会使用云中的套接字服务器和我的本地主机上的套接字服务器进行测试。 本地设置不会断开套接字(一切正常),而在云设置套接字中不断连接和断开连接。 所以,我不认为这是问题所在。
@muhammadnasr好吧,太好了。 已实际启用它,但仍有一些问题。

@muhammadnasr @darrachequesne @dnwldbs84
我认为在我的情况下它已经解决了。
我在 android 前台服务(api 26)中使用 0.8.3 socket.io-client,在 nodejs 服务器中使用 1.3.5 版本。
但是,问题可能不是版本。
我将服务器中的 pingInterval 更改为 10ms,它似乎工作正常(没有发生 ping 超时和传输关闭)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });

它神奇地工作,谢谢!!!!!!!

我发现我在每个 ping 间隔都得到了“传输关闭”。

我真的厌倦了这个问题。
我认为你们应该用“socket.io-client”检查“socket.io”的版本。
如果服务器/客户端版本不匹配,则连接非常不稳定。

我建议只为客户端使用如下所示的 CDN。