我只是让我的服务器断开在一定时间(比如 20 秒)后不发送数据的套接字。
我想知道使用计时器是否有好处,或者在套接字库中有什么特别之处吗?在服务器上为每个套接字使用计时器会使它变得很重。
让客户端程序处理它不安全吗?例如,每个客户端在一段时间不发送数据后都会断开连接。
最佳答案
作为保持事件检查的一部分,这应该很容易实现。除非你完全忽略连接断开的问题,否则你可能有一个保持事件的系统,如果没有通信,它会定期发送消息客户端->服务器,反之亦然。向套接字状态添加一个简单的“上次数据接收时间”值应该是微不足道的,然后如果套接字距离 DateTime.Now
太远则关闭套接字。
但更重要的问题是“为什么?”。最好的解决方案首先取决于您这样做的原因。您是否希望通过转储那些不发送数据的客户端来使服务器对更多客户端可用?你可能会让一切变得更糟,因为 TCP 套接字的超时更像是 2-4 分钟,所以当你在 20 秒后断开客户端并重新连接时,它现在将使用两个服务器端端口,而不是一个。糟糕。
关于您对已删除答案的评论,和没有数据发送和接收的连接我认为它会浪费您的线程
指向更接近您的实际问题 - 您的服务器的连接量应该没有与服务器用于为这些连接提供服务的线程数有关。因此,打开的连接唯一会“浪费”的基本上是一点内存(取决于每个连接所需的内存量,加上套接字成本及其缓冲区)和一个 TCP 端口。这在某些应用程序中可能是个问题,但如果您达到了那种“负载”级别,您可能已经可以祝贺自己了。在接近端口限制之前,您很可能会耗尽其他资源(基于听起来您正在制作 MMO 游戏这一事实的假设)。如果您确实遇到了这些问题,您可能想要放弃 TCP 并用 UDP 重写所有内容(或者最好是在 UDP 之上的一些现成的解决方案)。
关于c# - 在一定时间后没有收到数据时断开套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27866145/