Socket.io: Socket.io 与 ping 超时随机断开连接

创建于 2016-11-28  ·  46评论  ·  资料来源: socketio/socket.io

我们有一个实时聊天应用程序,它使用 socket.io、node.js、mongodb 等。聊天工作非常好,除了一个问题,如下所示

聊天用户之间的一段时间因ping 超时而断开连接。 当我检查时,互联网连接没有问题,也没有重新连接尝试的日志。 它直接断开连接。

操作系统 - Ubuntu 14.04/AWS EC2
服务器上的 socket.io 版本 - 1.6.0
节点版本 - v0.10.25

请让我们知道可能是什么问题。 如果您需要任何其他详细信息,也请告诉我

最有用的评论

关于我的问题的更多信息。
现在我发送较小的数据包,现在它没有在图像上传时断开连接,但它随机抛出 ping 超时错误,它完全随机发生,所以现在很难调试它的原因,因为数据包更小。

@IIaakso什么是推荐的 ping 超时设置,我现在是这些:

我的客户端js:

image

我的服务器设置:

image

在“socket.io”上仍然面临同样的问题:“2.2.0”,
"socket.io-client": "2.2.0",

image
socket.io-客户端:套接字关闭(ping 超时)+22s

所有46条评论

您是否尝试过收听任何发出的错误事件?
这是一篇堆栈溢出文章,其中包含套接字发出的常见事件列表。

http://stackoverflow.com/questions/24224287/list-of-socket-io-events

我也有同样的问题你解决了吗?

@jitendrapawar你能一直重现吗?

不,它不是重复的,它是随机与 ping 断开连接的
暂停。

2017 年 1 月 10 日晚上 7:50,“Damien Arrachequesne”通知@github.com
写道:

@jitendrapawar https://github.com/jitendrapawar你能
持续繁殖?


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/socketio/socket.io/issues/2769#issuecomment-271586816
或静音线程
https://github.com/notifications/unsubscribe-auth/ANP7JpiqxkTpZlc5CsayjIZf9GAqURLiks5rQ5OsgaJpZM4K9hrg
.

  • 你发送二进制数据吗? (https://github.com/socketio/socket.io/issues/2666)
  • 它是否在给定延迟后超时(可能与代理相关)?
  • 它与给定的浏览器有关吗?
  • ping 超时后它们是否正确重新连接?

同样的问题在这里。 不会发出其他错误。 似乎完全是随机的。

我禁用网络,并立即启用它。 大约 1 分钟后,服务器出现“ping 超时”问题。

  pingInterval: 25000,
  pingTimeout: 60000,

作者说: a client may have to wait up to pingTimeout + pingInterval ms before getting a disconnect event.
但我发现当我 F5 网页时,我会得到一个新的socket.id ,我断开连接了吗????我刷新我的页面不到 1 秒,
我找不到这个如何工作

我也刚遇到这个问题。 我们的应用程序在没有这些断开连接的情况下运行良好一年多,但现在遇到随机断开连接。 在调试中,断开连接的原因是“ping 超时”,客户端重新连接似乎没有问题。

到目前为止,我唯一可以缩小范围的是新版本的谷歌浏览器。 Chrome 63 似乎没有问题,但 64 上的用户遇到了断开连接,我不知道为什么

我面临着完全相同的问题,我在 Chrome 63 @jstelz 上。 有没有人发现问题或解决方案?

@darrachequesne在我的情况下,它肯定与后台选项卡中限制的客户端计时器问题有关(至少在 chrome 中,我尚未在其他浏览器中对其进行测试)。
我看到其他人提到的相同症状,并且很容易重现。 我只需要启动我的网络应用程序,确保它连接,然后打开另一个选项卡以强制我的应用程序在后台运行。 最终计时器将受到 chrome 的限制,导致 ping 超时,这最终将使服务器断开我的应用程序,因为它认为该应用程序不再存在。
有一种可能的方法可以在 chrome 中禁用这种限制 => https://www.tenforums.com/tutorials/80233-enable-disable-google-chrome-background-tab-throttling-windows.html
但这并不完美,有时甚至不适用。 可能唯一好的解决方案是在 primus lib 中也做了什么:反转 ping/pong 消息的方向(https://github.com/primus/primus/pull/534)
不过,这似乎是 engine.io 中的一个相当大的重构,影响了服务器和客户端库......

@sirudog好吧,这是一个很大的突破性变化! 不过我认为我们必须这样做......

我正在开发的游戏中遇到了这个问题。

当我将服务器设置为
pingInterval: 1000, pingTimeout: 500
我的客户端大约每秒发送一次 ping 超时并重新连接。

当我将服务器设置为
pingInterval: 500, pingTimeout: 1000
我没有超时,但服务器从未检测到断开连接。

对于任何遭受随机超时的人,请尝试更改默认的 engine.io“传输升级超时”(upgradeTimeout)。

重新连接并接收大量数据后,套接字似乎没有响应,调试engine.io没有显示任何错误,只是每次客户端重新连接时套接字都试图升级传输。

示例服务器:

// index.js
import io from 'socket.io';
import expressApp from './express/expressApp'; // express server
import socket from './socket/socket';

const port = 4000;
expressApp.set('port', process.env.Port || port);

const server = expressApp.listen(port, 'localhost');

const socketIo = io(server, {
  upgradeTimeout: 30000 // default value is 10000ms, try changing it to 20k or more
});

socket(socketIo);

// socket.js
export default socketIo =>
  socketIo.on('connection', socket => {
  //...return large amount of data
  }
}

您可以在此处阅读有关 engine.io 的更多信息:
https://github.com/socketio/engine.io

你好

对于任何遭受随机超时的人,请尝试更改默认的 engine.io“传输升级超时”(upgradeTimeout)。

重新连接并接收大量数据后,套接字似乎没有响应,调试engine.io没有显示任何错误,只是每次客户端重新连接时套接字都试图升级传输。

示例服务器:

// index.js
import io from 'socket.io';
import expressApp from './express/expressApp'; // express server
import socket from './socket/socket';

const port = 4000;
expressApp.set('port', process.env.Port || port);

const server = expressApp.listen(port, 'localhost');

const socketIo = io(server, {
  upgradeTimeout: 30000 // default value is 10000ms, try changing it to 20k or more
});

socket(socketIo);

// socket.js
export default socketIo =>
  socketIo.on('connection', socket => {
  //...return large amount of data
  }
}

您可以在此处阅读有关 engine.io 的更多信息:
https://github.com/socketio/engine.io

你好,

我试过了,但仍然有很多断开连接:

15:10:57,270 UrbanGUI INFO 已连接
15:10:57,549 UrbanGUI INFO 客户端断开连接:6830bd090575426f9c53dec108702e04
15:10:59,70 UrbanGUI INFO 已连接
15:10:59,342 UrbanGUI INFO 客户端断开连接:e2eb60d8a2aa445f94a17b6c6fc00e34
15:11:00,770 UrbanGUI INFO 已连接
15:11:01,41 UrbanGUI INFO 客户端断开连接:62b2619d3b3a4c05aa9cfa0ad3df9524
15:11:02,655 UrbanGUI INFO 已连接
15:11:02,940 UrbanGUI INFO 客户端断开连接:a421da49b04c46f38c1ae8c08b14e5db
15:11:04,153 UrbanGUI INFO 已连接
15:11:04,421 UrbanGUI INFO 客户端断开连接:b935f53d393c42488411e2b6c3e5961a
15:11:05,359 UrbanGUI INFO 已连接
15:11:05,630 UrbanGUI INFO 客户端断开连接:ee8a42bb8b0e4bc8b9e813dd808c1dc3
15:11:07,232 UrbanGUI INFO 已连接
15:11:07,513 UrbanGUI INFO 客户端断开连接:5c9804841d0a438e87536977c222c630
15:11:08,703 UrbanGUI INFO 已连接
15:11:08,981urbanGUI INFO客户端断开连接:a5dfcc72eb5c4445b09fb28153220961
15:11:10,601 UrbanGUI INFO 已连接
15:11:10,893 UrbanGUI INFO 客户端断开连接:394e409a10fa41a8aa7e7c747b4ea606
15:11:12,87 UrbanGUI INFO 已连接
15:11:12,360 UrbanGUI INFO 客户端断开连接:e83bacd1338d4306b8eaccc9597f7a0b
15:11:13,384 UrbanGUI INFO 已连接
15:11:13,661 UrbanGUI INFO 客户端断开连接:52cf363b5d26431a8b9b6459551aedcd
15:11:14,389 UrbanGUI INFO 已连接
15:11:14,664 UrbanGUI INFO 客户端断开连接:f254c71fbd374cac9bd3d4161e53456f
15:11:15,995 UrbanGUI INFO 已连接
15:11:16,275 UrbanGUI INFO 客户端断开连接:ec7d67d7b4a04019b3496dcf40e0d41a
15:11:17,709 UrbanGUI INFO 已连接
15:11:17,992 UrbanGUI INFO 客户端断开连接:68a9ea7e54f34cc3be9f9395b19943b7
15:11:18,720 UrbanGUI INFO 已连接
15:11:19,1urbanGUI INFO客户端断开连接:e17cdcf179d9482dbf4f6befc2e0db47
15:11:19,808 UrbanGUI INFO 已连接
15:11:20,91 UrbanGUI INFO 客户端断开连接:8f262794c9fc40bb90aa37f9fe20db80
15:11:21,430 UrbanGUI INFO 已连接
15:11:21,705 UrbanGUI INFO 客户端断开连接:2769a86f041c422ea7806ce11177b88f
15:11:23,95 UrbanGUI INFO 已连接
15:11:23,368 UrbanGUI INFO 客户端断开连接:3306fd1f321740e1a80d005291e1a801
15:11:24,662 UrbanGUI INFO 已连接
15:11:24,943 UrbanGUI INFO 客户端断开连接:ac6afdc9952440fc8d4846548adc50f2
15:11:25,774 UrbanGUI INFO 已连接
15:11:26,58 UrbanGUI INFO 客户端断开连接:5b270718206d49aeba597361bbff8be2
15:11:27,673 UrbanGUI INFO 已连接
15:11:27,952 UrbanGUI INFO 客户端断开连接:ce9bba31d7494d19800c24cd68aedb2c
15:11:29,477 UrbanGUI INFO 已连接
15:11:29,753 UrbanGUI INFO 客户端断开连接:a29d9cd1903c422f9606a801e4685c2c
15:11:30,684 UrbanGUI INFO 客户端断开连接:48924b51684e46008558c7577c1f6269
15:11:31,59 UrbanGUI INFO 已连接
15:11:31,325 UrbanGUI INFO 客户端断开连接:f2e6c04f38a94617bb6ac8a331cde224
15:11:32,858 UrbanGUI INFO 已连接
15:11:33,141urbanGUI INFO客户端断开连接:139db6786631476ea1561b669a0b2431
15:11:34,558 UrbanGUI INFO 已连接
15:11:34,844 UrbanGUI INFO 客户端断开连接:83940d8f836e48a5918e14794e19c0c8
15:11:35,547 UrbanGUI INFO 已连接
15:11:35,815 UrbanGUI INFO 客户端断开连接:5f85ca0cc1254b74b19d41f5c321ac8a
15:11:37,316 UrbanGUI INFO 已连接
15:11:37,593 UrbanGUI INFO 客户端断开连接:7554f2dd4fd54bad9b95300c1b0998ca
15:11:39,195 UrbanGUI INFO 已连接
15:11:39,476 UrbanGUI INFO 客户端断开连接:8fead9b5e8e148e9956778b7a91e875b
15:11:40,481 UrbanGUI INFO 已连接
15:11:40,767 UrbanGUI INFO 客户端断开连接:2579464ed45b418491bda2fc60b8bcc6
15:11:41,488 UrbanGUI INFO 已连接
15:11:41,761 UrbanGUI INFO 客户端断开连接:b8b25fec44584b288d12c297b21c72bd
15:11:42,686 UrbanGUI INFO 已连接
15:11:42,966urbanGUI INFO客户端断开连接:0f780d9ebc294e47bf3f5184c38c8836
15:11:44,388 UrbanGUI INFO 已连接
15:11:44,668 UrbanGUI INFO 客户端断开连接:14999c3f00314bb285bbde4501e3cecb
15:11:45,581 UrbanGUI INFO 已连接
15:11:45,849 UrbanGUI INFO 客户端断开连接:ada765125a374b7fbb4174d7d97bb901
15:11:47,95 UrbanGUI INFO 已连接
15:11:48,328 UrbanGUI INFO 已连接
15:11:48,602urbanGUI INFO加入房间:6e2f8d8f-d835-478b-12a3-70ba109603a1
15:12:15,248 UrbanGUI INFO 已连接
15:12:15,523 UrbanGUI INFO 加入房间:6e2f8d8f-d835-478b-12a3-70ba109603a1
15:12:41,806 UrbanGUI INFO 已连接
15:12:42,77 UrbanGUI INFO 客户端断开连接:1bfd592fe1274c4db14d37ee6e144726
15:12:43,582 UrbanGUI INFO 已连接
15:12:43,855 UrbanGUI INFO 客户端断开连接:63a0a6abdb3240f598af9e5947520362
15:12:44,988 UrbanGUI INFO 已连接
15:12:45,256 UrbanGUI INFO 客户端断开连接:930e46874fdd48888e6f2abac0e7f066

@kllr
更改断开连接事件以显示原因:

socket.on('disconnect', reason => {
            console.log(`reason: ${reason}`);
});

您可以尝试的另一件事是放弃传输升级

const socketIo = io(server, {
  transports: ['websocket'],
  allowUpgrades: false
});

我在 socket.io 2.2 上遇到了同样的问题。 一段时间后它会随机刹车并开始重新连接。 错误是ping timeout

有什么方法可以确保连接稳定且永不刹车? Myabe 一些浏览器或类似的东西?

你好,
同样的问题,我使用的是 socket.io 2.2.0,有人对此有解决方案吗?

你好

同样的问题发生在我身上,我在 socket.io 2.2.0 上,当客户端将 base64 中的图像发送到服务器时,在我的网站上时,图像很大,然后这会导致图像发送器客户端收到 ping 超时错误和断开客户端。 请让我们知道是否有人找到了任何修复程序。

你们可以尝试将 pingTimeout 设置为高于 pingInterval,就像这里建议的那样:
https://github.com/socketio/socket.io/issues/3259#issuecomment -474523271

服务器:

const socket = io(server, {
  pingTimeout: 30000
  // ...other props
});

客户:

const socket = io(`${config.server}`, {
    pingTimeout: 30000
    // ...other props
  });

默认 pingInterval 为 25000 毫秒。
如果这仍然不起作用,请仅尝试使用 websocket:

transports: ['websocket'],
allowUpgrades: false,
pingTimeout: 30000

关于超时,有一种未记录的(?)有问题的行为:如果服务器发送的大数据包传输时间超过超时间隔,则会导致超时和断开连接。 解决此问题的唯一方法是确保仅发送相对较小的数据包。 这是一个问题,因为这意味着您需要(过多)关注服务器逻辑,因此数据始终在限制范围内 - 而且 - 由于连接速度是未知因素,因此很难完全解决此问题。

我建议稍微调整超时逻辑来克服这个问题。

关于我的问题的更多信息。
现在我发送较小的数据包,现在它没有在图像上传时断开连接,但它随机抛出 ping 超时错误,它完全随机发生,所以现在很难调试它的原因,因为数据包更小。

@IIaakso什么是推荐的 ping 超时设置,我现在是这些:

我的客户端js:

image

我的服务器设置:

image

在“socket.io”上仍然面临同样的问题:“2.2.0”,
"socket.io-client": "2.2.0",

image
socket.io-客户端:套接字关闭(ping 超时)+22s

@FaizanZahid相同的问题。 它只是随机断开与 ping 超时...

同样的问题,我的设置与你的没有什么不同(forceNew:true,是最重要的部分imo)

我正在测试的发送和接收服务器上从带有节点 6.x 设置的古董 socket.io 1.x 升级到 socket.io 2.2 和节点 12.x。

在升级之前,我可以启动从源服务器(运行客户端)到目标服务器(运行 io 服务器)的大约 12k 个并发连接。

在更新之前检查和调整了明显的系统限制、防火墙限制等,因此“发送”和“接收”服务器都不应成为问题或限制的原因。

但是升级到 socket.io 2.2 后,我在启动大约 2.5k 并发连接时收到随机 ping 超时......

*编辑:我的测试应用程序中没有传输数据,因此这不是数据长度或内容类型问题。 客户端只连接到服务器,服务器为客户端执行自定义身份验证,如果身份验证成功,客户端等待服务器事件。

因此,对可能原因的任何见解都将受到高度赞赏;)

根据我在我的设置(FreeBSD 11.2,节点 12.3.x)上执行的测试,我可以观察和复制以下结果:

socket.io-客户端版本| socket.io 版本| 结果
2.2 | 2.2 | 大约 2000 个连接后的随机 ping 超时
1.3.5 | 2.2 | 与 4500 个并发连接完美配合
2.2 | 1.3.5 | 无法连接
1.3.5 | 1.3.5 | 与 4500 个并发连接完美配合

所以问题似乎出在 socket-io-client 2.2 的客户端部分,或者至少是 2.x 客户端分支......

有什么解决办法吗?? 在我的情况下,连接数没有问题,它只是在几个小时不活动并出现 ping 超时错误后随机断开连接......

我也有类似的问题,请问知道原因吗?

我有同样的问题。 我认为这对我来说真的很奇怪。

我在 React Native 应用程序中使用 Socket.io。 在 IOS 上,它正在工作。 但在 Android 上,它会在 30 毫秒后断开连接。 这是日志:

  engine:ws closing +30s
  socket.io:client client close with reason ping timeout +30s
  socket.io:socket closing socket - reason ping timeout +30s
  socket.io-parser encoding packet {"type":2,"data":["disUser",0],"nsp":"/"} +30s
  socket.io-parser encoded {"type":2,"data":["disUser",0],"nsp":"/"} as 2["disUser",0] +0ms
user disconnected: dxYGo3l7Dab-1qBfAAAA
reason: ping timeout

"socket.io": "^2.2.0"
"socket.io-client": "^2.2.0"

我该如何在我的 Android 端修复它?

@berksafran我只在 android 中面临同样的问题,你能告诉我你是如何修复的吗?

好吧,不幸的是我无法解决这个问题,但我看到这个问题只存在于开发过程中。 当您发布应用程序并尝试使用react-native run-android --variant=release ,您的 socket.io 服务器将正常工作。

我找到的另一个解决方案是将您的 socket.io 服务器上传到任何云服务器。 (heroku, digitalocean etc.) 上传后,您应该将您的连接地址设置为云服务器的url。 我已经尝试过了,现在可以使用了。

如果有任何问题,你可以在这里给我发短信。

祝你好运。

有人找到解决方案吗? 更新:我在部署我的应用程序后进行了测试,它可以工作。

嗨,大家好,
我正在使用 socket.io 开发一个应用程序。
对于客户端,我使用的是 socket.io-client 2.3.0
对于服务器,我使用的是 socket.io 版本 2.3.0

我的服务器托管在 heroku 上。 我正面临这些随机的 ping 超时。 当我在移动设备上打开我的应用程序时,ping 超时发生的频率更高。 我可以尝试的任何解决方案? 谢谢

@sukalyansen123从很久以前的调试中,我注意到它无法升级传输并且超时。 仅尝试使用 websockets:

const socketIo = io(server, {
  transports: ['websocket'],
  allowUpgrades: false
});

@sukalyansen123 - 我有一个类似的问题,对我来说,实际上明确设置默认超时似乎有帮助。

服务器端:

前:
let io = require('socket.io')(server, { transports: ['websocket'], allowUpgrades: false });

后:
`
让 io = require('socket.io')(服务器,
{
传输:['websocket'],
允许升级:假,
pingInterval: 25000, // 默认 - 25000
pingTimeout: 60000, // 默认 - 60000

});
`

谢谢。 我尝试这样做,但仍然没有帮助。 现在再次发生移动套接字断开连接,有时是由于 ping 超时,有时是由于传输关闭。 我不确定这是否是由于互联网连接中断,但我应该如何处理这个问题。

如果这有帮助,这就是我的客户端的样子 - 我只使用 websocket 协议连接
`
this.socket = io(serverURL,
{
传输:['websocket'],
自动连接:真

        });

`
希望这会有所帮助

如果这有帮助,这就是我的客户端的样子 - 我只使用 websocket 协议连接
`
this.socket = io(serverURL,
{
传输:['websocket'],
自动连接:真

        });

`
希望这会有所帮助

再次感谢。 还想知道您如何从客户端处理断开连接事件。

如果这有帮助,这就是我的客户端的样子 - 我只使用 websocket 协议连接
`
this.socket = io(serverURL,
{
传输:['websocket'],
自动连接:真

        });

`
希望这会有所帮助

这似乎有点帮助。 但是,现在如果在传输关闭时保持空闲一段时间,套接字会断开连接。 定期发送心跳会是一个很好的解决方案吗?

我有同样的问题。 但我在我的在线游戏中使用套接字。
我测试了一些东西,我发现当 ping 超时时会显示!
原因是当客户端(用户电话)睡眠或退出我的游戏时,服务器将断开它。
但我没有找到任何解决方案来修复它! 然而。

在服务器端试试这个代码

var fs = require('fs');
var pkey = fs.readFileSync('/etc/ssl/private/ssl.key'); //Replace the path of your SSL key
var pcert = fs.readFileSync('/etc/ssl/certs/ssl.crt');//Replace the path of your SSL cert
var options = {
  key: pkey,
  cert: pcert
};

var app = require('https').createServer(options);

var io = require('socket.io')(app, {'pingTimeout': 180000, 'pingInterval': 25000});

这里 pingInterval 很重要,保持较低,我尝试了各种值,发现 25 秒可以让套接字在超时之前保持 ping 状态。 主要问题是如果在 60 秒内没有 ping/pong 则它会断开连接并尝试自动重新连接。 我还发现服务器端的 pingTimeout 和超时和客户端无法帮助在 60 秒内断开套接字。 它的发生是由于 chrome 最新版本 83.*

如上所述,我们将恢复 Socket.IO v3 中的 ping/pong 机制: https :

我也开始面临同样的问题。 我正在使用版本 socket.io 版本2.0.4并在使用socket.io-redis实现具有多个节点的套接字后开始接收ping timeout问题。 但是它在没有 redis 的单节点上完全正常工作。 有人可以帮我解决任何可能的原因吗?

我们的项目刚刚将节点更新到 v12。 在那次更新之后,我们也因为 ping 超时而断开连接:| 以下是发生断开连接的时间列表:

11:06:59
11:08:19 +80s
11:10:39 +140s
11:14:39 +240s
11:15:59 +80 秒
11:20:59 +300s
11:22:19 +80 秒
11:23:19 +60s
11:24:39 +80s
11:28:59 +260s

我们的设置:
超时:30s
间隔:20s
重连延迟:10s

嘿! 有同样的问题。 Socket.io 版本 2.3.0(客户端和服务器版本相同)。
我的问题出在服务器上。 在我检查了服务器准备通过套接字发送的响应需要多少时间后,经过 2 天的挖掘,我发现了问题。 这是一种执行时间会线性增加的方法,当它开始执行需要 1s+ 时,服务器只是无法响应客户端的 ping,然后客户端会发出连接关闭和连接重试,从这里开始你知道其余的。
所以,总而言之,我要说的不是 socket.io 问题,而是最常见的服务器问题。
希望这可以帮助。

匹配服务器和客户端的版本为我解决了这个问题。 我已经用 V 3.0.4 & 2.3.0 测试过

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

相关问题

doughsay picture doughsay  ·  4评论

Elliot9 picture Elliot9  ·  4评论

chfeizy picture chfeizy  ·  3评论

dmuth picture dmuth  ·  3评论

varHarrie picture varHarrie  ·  3评论