在c#中处理TCP服务器中的用户超时
本文关键字:用户 服务器 超时 TCP 处理 | 更新日期: 2023-09-27 18:16:26
我正在编写一个简单的c# tcp消息服务器,它需要响应一个已连接的客户端在最后一个TimeSpan timeout
保持沉默的事实。换句话说
- 客户端A连接。
- 客户端A发送东西。
- 服务器响应客户端a
- 客户端B连接。
-
timeout
时间过去,客户端A没有发送任何消息。 - 服务器发送"ping"(不像网络ping,而是像一个消息,
SendPing
)到a。 - 客户端B发送东西。 服务器响应
- 。
-
pingTimeout
次ping到A后,断开与A的连接,客户端被移除。 如果B静音时间过长,也会发生相同的情况。
简单的故事。如果在timeout
中没有听到client[n]
的消息,则发送ping。如果ping得到响应,只需更新client[n].LastReceivedTime
,然而,如果client[n]
在pingTimeout
内没有响应,则断开连接。
据我所知,这必须通过某种调度器来完成,因为简单地做一个循环,像这样
while(true) {
foreach(var c in clients) {
if(DateTime.Now.Subtract(c.LastReceivedTime) >= timeout && !c.WaitingPing)
c.SendPing();
else if(DateTime.Now.Subtract(c.LastReceivedTime) >= timeout + pingTimeout && c.WaitingPing)
c.Drop();
}
}
只会把CPU炸了,一点用都没有。是否有一个很好的简单的算法/类来处理这样的情况,可以很容易地在c#中实现?并且它需要同时支持100-500个客户端(至少,只有当它可以处理更多时,它才是正的)。
你的解决方案是好的,我想如果你使用一个专用线程,并把Thread.Sleep(1000)
在那里,所以你不像你说的炒CPU。避免阻塞这个线程的调用例如确保你对SendPing
和Drop
的调用是异步的,所以这个线程只做一件事。
另一个解决方案是使用System.Timers.Timer
每个客户端连接,它的间隔等于ping定时器。我正在使用这种方法,并与500个客户进行了测试,没有问题。(20秒间隔)。如果您的间隔很短,我不建议这样做,并查看使用单个线程检查的其他解决方案(如您的解决方案)