我只是让我的服务器断开套接字,在一段时间后发送没有数据,比如20秒。
我想知道使用计时器是否有用,或者套接字库中是否有特殊功能?在服务器上使用每个套接字的定时器会使它变得很重。
让客户端程序处理它是不安全的吗?例如,在一段时间内不发送数据后,每个客户端都会断开连接。
答案 0 :(得分:2)
这应该很容易实现,作为保持活动检查的一部分。除非您完全忽略掉线连接的问题,否则您可能会有一个保持活动的系统定期发送消息客户端 - >服务器,反之亦然,如果没有通信。添加一个简单的"最后收到的数据时间应该是微不足道的。值为套接字状态,如果距离DateTime.Now
太远,则关闭套接字。
但更重要的问题是"为什么?"。最好的解决方案取决于您的原因是什么。您是否希望通过转储那些不发送数据的服务器来使服务器对更多客户端可用?您可能会使一切变得更糟,因为TCP套接字的超时更像是2-4分钟,因此当您在20秒后断开客户端并重新连接时,它现在将使用两个服务器端端口,而不是一个。糟糕。
至于您对已删除答案的评论,and connection without data send and receive i think it gonna waste your threads
更接近您的真实问题 - 您的服务器连接的数量应该与服务器用于为这些连接提供服务的线程数无关。所以开放式连接唯一会浪费掉#34;基本上是一点内存(取决于每个连接需要的内存量,加上其缓冲区的套接字成本)和TCP端口。这在某些应用程序中可能是一个问题,但是如果你达到了那个级别的加载",你可能已经祝贺自己了。在接近端口限制之前,您将更有可能耗尽其他资源(假设您听起来像是在制作MMO游戏)。如果你确实遇到了那些问题,你可能想要丢弃TCP并重写UDP中的所有内容(或者最好是在UDP之上的一些现成解决方案)。
答案 1 :(得分:0)
客户端 - 服务器模型描述了客户端应如何连接到服务器并执行请求。 我建议您连接到服务器,当您完成检索所需的所有日期后,关闭套接字(在客户端)。
服务器最终会找到已释放的套接字资源,但您可以检查套接字的Connected属性以更快地释放资源。
答案 2 :(得分:0)
当客户端断开与服务器的连接时,服务器可以获得断开事件。它看起来像
socket.on('disconnect', function () {
// Disconnect event handling
});
在客户端,您还可以找到断开事件..您需要重新连接服务器。