非活动客户端连接的socket.io服务器端超时?

     2023-04-18     119

关键词:

【中文标题】非活动客户端连接的socket.io服务器端超时?【英文标题】:socket.io server-side timeout for inactive client connection? 【发布时间】:2015-09-08 13:49:30 【问题描述】:

我知道,如果 socket.io 客户端库没有定期收到对其发送到服务器的 ping 数据包的响应(假设由于某种原因,连接已断开)。而且,还有用于控制这种重新连接行为的客户端选项。

但是,如果客户端不活动并停止发送 ping 消息(比如因为客户端进入睡眠状态),服务器端会发生什么?我在 socket.io 服务器端文档中找不到任何解释这种情况或允许对其进行配置的信息。服务器会关闭一个不活动的客户端 socket.io 连接(它没有从它接收 ping 消息的连接)吗?如果是这样,服务器将等待多长时间?该行为是否可配置?

【问题讨论】:

如果您在 socket.io 文档中找不到合适的内容,您可以为此行为编写自己的代码。 重新。服务器端,socket.on('disconnect', ...) 会在超时后处理任何客户端无响应吗? disconnect 捕获离开页面的客户,您可以使用io.engine.clientsCount 显示剩余的客户。 @Data - 仅当客户端以有序的方式关闭并关闭其套接字时才会发生断开连接,而不是仅在它们失去连接时才会发生。当客户端刚刚失去连接时,此时不会向服务器发送任何内容。服务器必须以某种方式意识到,嗯,我已经很久没有收到这个客户端的任何消息了——我想知道他们现在是否已经消失了。 socket.io 协议的 ping/pong 部分是为了帮助检测这种情况。 这个有帮助吗:“非活动,io 会自动关闭一个套接字”,***.com/a/9708962/1837472 【参考方案1】:

根据 socket.io 2.20 自述文件(截至 2020 年 1 月的最新版本):

“在 Engine.IO 级别实现了心跳机制,允许服务器和客户端都知道对方何时不再响应。

该功能是通过在服务器和客户端上设置的计时器实现的,并在连接握手期间共享超时值(pingIntervalpingTimeout 参数)。"

因此,您可以通过在 socket.io 内的 engine.io 组件上设置以下超时属性来配置服务器端和客户端超时设置。

使用 socket.io 2.20 版:

const io = ...; // initialize socket.io how you wish
io.eio.pingTimeout = 120000; // 2 minutes
io.eio.pingInterval = 5000;  // 5 seconds

使用旧版本的 socket.io 也是如此:

const io = ...; // initialize socket.io how you wish
io.set('heartbeat timeout', 1200000);
io.set('heartbeat interval', 5000);

【讨论】:

【参考方案2】:

Disconnection detection

Engine.IO 连接在以下情况下被视为关闭:

一个 HTTP 请求(GET 或 POST)失败(例如,当服务器关闭时) WebSocket 连接已关闭(例如,当用户关闭其浏览器中的选项卡时) socket.disconnect() 在服务器端或客户端调用 还有一种心跳机制检查服务器和客户端之间的连接是否仍然正常运行:

在给定的时间间隔(握手中发送的 pingInterval 值),服务器发送一个 PING 数据包,客户端有几秒钟(pingTimeout 值)发送一个 PONG 数据包。如果服务器没有收到返回的 PONG 数据包,则认为连接已关闭。反之,如果客户端在 pingInterval + pingTimeout 内没有收到 PING 包,则认为连接已关闭。

断开连接的原因列在here(服务器端)和here(客户端)。

pingTimeout(Number): 没有pong包多少毫秒认为连接关闭(60000)

pingInterval(Number):多少毫秒再发送一个新的ping包(25000)

https://socket.io/docs/v4/server-api/

https://github.com/socketio/engine.io#methods-1

【讨论】:

这两个不是客户端设置吗? 我不这么认为。查看答案中的链接 我在您链接的 server-api 页面上看不到这些设置。 问题在于发送 ping 的是客户端,而服务器则使用 pong 进行响应。因此,这两个设置都控制客户端的行为,即发送 ping 的频率以及等待 pong 响应的时间。在我看来,它们似乎并不真正适用于服务器。我想知道服务器在一段时间内没有 ping 时会做什么。服务器不会按时间间隔发送 ping。它只是监听 ping 并发送一个 pong 作为响应。 当客户端连接时,服务器做的第一件事就是发送一个打开事件socket received: type 'open', data '"sid":"zc8mQaGAEYuC_FTKAAA8","upgrades":["websocket"],"pingInterval":25000,"pingTimeout":60000',并带有所需的时间间隔和超时。然后客户端在打乒乓球时遵守这些规则。【参考方案3】:

在 socket.io 2.20 上。这可以在初始化socket.io时设置

const io = require("socket.io")(pingTimeout: 10000, pingInterval: 30000);

查看所有选项及其默认值here

【讨论】:

在 socket.io 中控制来自客户端的心跳超时

】在socket.io中控制来自客户端的心跳超时【英文标题】:Controllingtheheartbeattimeoutfromtheclientinsocket.io【发布时间】:2012-09-3016:21:26【问题描述】:我有移动客户端连接到node.js服务器,通过xhr-polling运行socket.io。我有两种类型的客户... 查看详情

Socket.io - nodejs 服务器端。重新连接后传输关闭

...】:2016-09-1204:21:51【问题描述】:我有两个浏览器socket.io客户端。例如。客户端A和客户端B,它们连接到一号房间。我的电脑上发生了以下行为(安装了nodejs5,socket.io1.4.5):我们假设两个客户端都 查看详情

客户端和服务器端(React/Node.js)之间的 Socket.io 连接失败

】客户端和服务器端(React/Node.js)之间的Socket.io连接失败【英文标题】:Socket.ioconnectionfailsbetweenclientandserverside(Reacr/Node.js)【发布时间】:2020-06-2020:09:21【问题描述】:我正在尝试建立一个基本的套接字连接。服务器如下所示:... 查看详情

socket.io 中的连接限制

...0-2423:09:00【问题描述】:使用带有socket.io的nodejs服务器和客户端,我可以让14k客户端连接。即使在使用集群时也略少。CPU或RAM均未耗尽。除了socket.io自己执行的自动ping之外,不会传输任何数据。传输设置为仅使用“websocket”,... 查看详情

Socket.io 与 flask-socketio python。如何设置套接字保持活动/超时

...】:我正在努力寻找有关socket.io超时值的任何文档。我在客户端使用//cdnjs.cloudflare.com/ajax/libs/soc 查看详情

带有非 socket.io 服务器的 Socket.io 客户端

】带有非socket.io服务器的Socket.io客户端【英文标题】:Socket.ioclientwithnon-socket.ioserver【发布时间】:2016-04-2315:35:03【问题描述】:我尝试使用socket.io客户端连接到non-socket.iowebsocket服务器。但我做不到。我正在尝试像这样连接到套... 查看详情

socket.io简介

...自定义了一种基于websocket的协议,所以socket.io的服务端和客户端必须配套。简言之,如果服务端使用socket.io,那么客户端就没得选了,必然也用socket.io的客户端。socket.io的服务端是基于node实现的(只提供了这一种语言的服务端... 查看详情

websocket——通信梳理(短轮询、长轮询、socket、websocket、socket.io)

参考技术A短轮询polling1、由客户端定时向服务器发送请求,服务器返回数据。2、缺点:必须由客户端发起请求,服务器才能向客户端返回数据,服务端无法自主向客户端发送数据;由于客户端必须定时发送请求,可能导致数据... 查看详情

socket.io 通过 XHR 轮询强制断开连接

...ing【发布时间】:2012-08-1603:37:42【问题描述】:我有一个客户端/服务器应用程序,在服务器上使用nodejs和socket.io作为连接机制。出于与我的应用程序相关的原因,我希望每个浏览器只有一个活动连接,并拒绝来自其他选项卡的... 查看详情

android中所有活动的单socket.IO连接

...描述】:我已经为here的SocketIOClient引用创建了Singleton类。服务器已连接。我可以将请求从活动发送到SocketIOClient。但是如何从Activity中的Singleton类获得响应?这里 查看详情

基于heroku socket.io服务器的heroku空闲连接超时

】基于herokusocket.io服务器的heroku空闲连接超时【英文标题】:herokuIdleconnectiontimeoutonherokusocket.ioserverbased【发布时间】:2014-07-0600:07:47【问题描述】:有时我的套接字服务器会引发以下问题:这里是heroku日志:heroku[router]:at=errorcod... 查看详情

socket.io(转载)

socket.io中文手册,socket.io中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html服务端io.on(‘connection’,function(socket));//监听客户端连接,回调函数会传递本次连接的socketio.sockets.emit(‘String’,data);//给所有客户端广播消息io.socket 查看详情

socket服务端的实现

...用法:服务端部分io.on(‘connection’,function(socket));//监听客户端连接,回调函数会传递本次连接的socketio.sockets.emit(‘String’,data);//给所有客户端广播消息io. 查看详情

socket.io heroku 请求超时

...ess.js构建的基本聊天应用程序。它适用于大多数通过聊天连接的客户,但对于一个客户,我从herokudyno收到多个错误:herokurouter--at= 查看详情

使用 socket.io 时客户端未连接

】使用socket.io时客户端未连接【英文标题】:Clientnotconnectingwhenusingsocket.io【发布时间】:2020-05-1803:55:18【问题描述】:我不知道我错过了什么。没有抛出任何错误或任何东西,它只是没有连接。服务器端代码constpath=require(\'path\'... 查看详情

socket.io

varapp=require(‘express‘)();  varhttp=require(‘http‘).Server(app);vario=require(‘socket.io‘)(http);//服务端io.on(‘connection‘,function(socket));  监听客户端连接,回调函数会传递本次连接的socketio.sockets.emit(‘String‘,data); 查看详情

Node.js:socket.io 关闭客户端连接

】Node.js:socket.io关闭客户端连接【英文标题】:Node.js:socket.iocloseclientconnection【发布时间】:2013-08-1004:54:21【问题描述】:如何关闭客户端的套接字连接?我正在使用:socket.io0.9node.js0.10.15表达3.3.4即:致电localhost/test--服务器端v... 查看详情

socket.io笔记三之子命名空间的socket连接

当客户端发送admin命名空间下的连接,如果主连接也监听了connetion事件,主连接的connection事件会先触发执行,然后紧接着触发执行admin命名空间下的connection事件。如果客户端连接的是主连接,admin空间下的connection事件不会触发执... 查看详情