这不是一个问题,说真的,我只是在寻找一些准则:) 我目前正在写这应该使用的线程低数量,因为它可以一些抽象的TCP服务器。非阻塞TCP服务器
目前它的工作方式如下。我有一个线程正在监听和一些工作线程。 Listener线程只是坐等客户端连接我希望每个服务器实例有一个单一的监听器线程。工作线程正在客户端套接字上执行所有读/写/处理任务。
所以我的问题是建立有效的工作进程。我遇到了一些我仍然无法解决的问题。工人代码是类似的东西(代码是非常简单的只是为了显示一个地方,我有我的问题):
List<Socket> readSockets = new List<Socket>();
List<Socket> writeSockets = new List<Socket>();
List<Socket> errorSockets = new List<Socket>();
while(true){
Socket.Select(readSockets, writeSockets, errorSockets, 10);
foreach(readSocket in readSockets){
// do reading here
}
foreach(writeSocket in writeSockets){
// do writing here
}
// POINT2 and here's the problem i will describe below
}
它的工作原理都smothly接受,因为while循环是循环的100%的CPU使用率一遍,如果我让我的客户端执行send-> receive-> disconnect例程,这并不是那么痛苦,但是如果我试着保持活动,再次send-> receive-> send->再接收一遍,它确实会吃掉所有的CPU。所以我的第一个想法是在那里安排睡眠,我检查是否所有的套接字都有数据发送,然后将Thread.Sleep放在POINT2中,持续10ms,但是这10ms之后,当我想要接收下一个时间时,会产生10ms的巨大延迟命令从客户端套接字。例如,如果我不试图“保持活着”命令正在执行10-15毫秒内,并保持活着它变得更糟的至少10毫秒:(
也许这只是一个糟糕的架构?有什么办法可以让我的处理器无法获得100%的利用率,而我的服务器会尽快对客户端插座上出现的问题做出反应?也许有人可以指出一个非阻塞服务器和它应该维护的体系结构的一个好例子吗?
它会产生大量的线程,不是吗?我使用循环,所以我可以通过读/写一个小缓冲区来处理一个线程中的大量套接字。 – hoodoos 2010-04-25 18:38:26
我想它会的。你确定这是一个问题吗?在任何情况下,你可以发布你的确切代码,导致100%的CPU?避免它的一个想法是有一个特殊的“保持活着”的消息,像服务器发送“ping?”的东西。给客户**每x秒**并期待“pong!”在下一个“平?”之前?应该发送。如果它不来,则假设连接断开。这样你就没有睡觉了。保持活力只是每60秒完成一次,而不是等。例如,您可以使用AutoResetEvent来指示何时应发送保持活动状态,具体取决于代码我认为 – IVlad 2010-04-25 18:55:40
@hoodoos您可以在单个线程上使用TcpListener BeginAccept,在下一次调用BeginAccept()你的AsyncCallback。在听另一个连接之前,您可以完全处理一个连接。 – khargoosh 2016-08-16 01:23:59