2012-04-24 36 views
5

我需要通过专有协议通过TCP连接数千个客户端以循环获取数据。我需要用C#编写.NET服务器应用程序。通过数千个TCP套接字轮询

第一次尝试是为每个TCP套接字创建一个自己的线程,该线程工作正常,但需要大量的CPU使用。

我发现改用.NET线程池会更好。据我所知(http://msdn.microsoft.com/en-us/library/ms973903.aspx)我可以使用定时器,以便让每个套接字在给定的时间周期(如1秒)周期性地获取数据。这对我来说不起作用,因为一旦连接打开,套接字就会超时,因为在打开套接字再次打开之前,有很多套接字必须打开。

另一个尝试是使用异步回调。这会适用于我,但我不知道如何让套接字周期性地获取数据?

+2

“成千上万”和“线索”这些词不能相互结合。尝试查看是否可以使用'await'关键字进行延续,这将允许您针对阻止端口编写代码,而不会经常实际阻止代码。这就是Erlang和Stackless Python背后的原理 - 专为网络并发而构建的两种语言。 – 2012-04-24 14:53:28

+1

为什么要循环客户端来获取数据?它会更简单(尽管这是相对的),只需在每个套接字上保留一个异步读取并在数据到达时处理数据。如果您真的需要循环读取,则可以推迟异步读取的重新发布,直到所有其他套接字都被服务。 – 2012-04-24 14:54:03

+1

只是不投票。 – 2012-04-24 14:54:04

回答

6

尝试使用套接字的high performance API,该套接字允许在大量套接字上同时接收数据,而无需每个套接字使用一个线程。在文章的底部有一个完整样本的链接。在MSDN文章中还有一个关于SocketAsyncEventArgs class的示例。

+0

Socket的高性能API似乎能够处理大量的传入连接。我需要打开这些连接。为了达到这个目的,是否可以使用Socket的高性能API? – sqeez3r 2012-04-25 07:14:19

+1

是的,为每个客户端创建并打开一个套接字,然后使用['Socket.ReceiveAsync()'](http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.receiveasync.aspx )。 – 2012-04-25 08:46:19

+1

我用这种方式实现了它,它效果很好。谢谢! – sqeez3r 2012-10-26 09:41:46

0

为什么不用你需要轮询的地址填充一个队列,并让你的线程池将项目从队列中处理掉?

一旦你完成一个项目推到队列的后面。

+3

首先,如果你有很多不活跃的连接,你会浪费很多时间无缘无故地检查它们。 – 2012-04-24 15:00:37

+0

我认为这需要花费太多时间来处理数千个连接。如果可能,我需要每秒钟从所有套接字更新。 – sqeez3r 2012-04-24 15:16:40