在一定时间后断开套接字,没有收到任何数据

本文关键字:任何 数据 定时间 断开 套接字 | 更新日期: 2023-09-27 18:37:01

我只是让我的服务器断开连接套接字,在一定时间(例如 20 秒)后不发送任何数据。

我想知道使用计时器是否对此有好处,或者套接字库中是否有特别的东西?在服务器上为每个套接字使用计时器会使它变得沉重。

让客户端程序处理它是否不安全?例如,每个客户端在一段时间不发送数据后断开连接。

在一定时间后断开套接字,没有收到任何数据

作为保持活动状态检查的一部分,这应该很容易实现。除非您完全忽略连接断开的问题,否则您可能有一个保持活动状态的系统,该系统会定期发送消息客户端>服务器,反之亦然,如果没有通信。在套接字状态中添加一个简单的"上次数据接收时间"值,然后在它离DateTime.Now太远时关闭套接字应该是微不足道的。

但更重要的问题是"为什么?最好的解决方案首先取决于您的原因是什么。您是否希望通过转储那些不发送数据的客户端来使服务器可供更多客户端使用?您可能会使一切变得更糟,因为TCP套接字的超时更像是2-4分钟,因此当您在20秒后断开客户端并重新连接时,它现在将使用两个服务器端端口,而不是一个。哎呀。

至于您对已删除答案的评论,and connection without data send and receive i think it gonna waste your threads更接近您的实际问题 - 您的服务器拥有的连接量应该与服务器用于为这些连接提供服务的线程数无关。因此,开放连接唯一会"浪费"的基本上是一点内存(取决于每个连接所需的内存量,加上其缓冲区的套接字成本)和一个TCP端口。这在某些应用程序中可能是一个问题,但是如果您达到这种"负载"级别,您可能已经可以祝贺自己了。在接近端口限制之前,您更有可能耗尽其他资源(假设基于听起来像您正在制作MMO游戏的事实)。如果您确实遇到这些问题,您可能无论如何都希望删除 TCP 并在 UDP 中重写所有内容(或者最好是在 UDP 之上的一些现成解决方案)。

客户端-服务器模型描述客户端应如何连接到服务器并执行请求。我建议您连接到服务器,并在完成检索所需的所有日期后,关闭套接字(在客户端)。

服务器最终会找到已释放的套接字资源,但您可以检查套接字的 Connected 属性以更快地释放资源。

当客户端与服务器断开连接时,服务器可能会发生断开连接事件。 它看起来像

socket.on('disconnect', function () {
 // Disconnect event handling 
});

在客户端,您还会发现断开连接事件..,您需要重新连接服务器。