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

Disconnecting socket after certain amount of time that no data recceived

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

我想知道使用计时器是否有好处,或者在套接字库中有什么特别之处吗?在服务器上为每个套接字使用计时器会使它变得很重。

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

作为保持活动检查的一部分,这应该很容易实现。除非你完全忽略连接断开的问题,否则你可能有一个保持活动的系统,如果没有通信,它会定期发送消息客户端->服务器,反之亦然。向套接字状态添加一个简单的 "last data received time" 值应该是微不足道的,然后如果套接字与 DateTime.Now.

相距太远则关闭套接字

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

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

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

服务器最终会发现socket的资源被释放,但是您可以检查socket的Connected 属性以更快地释放资源。

当客户端与服务器断开连接时,服务器可以获得断开连接事件。看起来像

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

});

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