2009-11-18 83 views
1

我看到的有关套接字通信的许多教程似乎每个套接字使用1个线程。但在用于在线游戏的服务器上,您可能有10k个并发用户--10k线程可能不是一个好主意。 我遇到了一个工具(SmartFox),声称使用单线程监视所有套接字连接,可能有数千个套接字连接。这个应用恰好在Java中,但我认为C++或C#可以做同样的事情......你会如何实现这一目标?使用单线程维护多个套接字连接

+0

伟大的联系,我将在稍后详细阅读。你为什么把这个添加为评论,而不是答案? –

回答

0

实现一个排队系统与一个线程轮询网络和x线程作为工人。您需要围绕代码排队和排队连接的代码执行关键部分

+0

啊,是的那个旧模式。一个明显的解决方案,我应该看到,考虑到我过去曾经使用它。 –

+0

查看java.nio.channels.Selector以便在轮询套接字的线程中使用。 –

0

如果你使用C++,看看boost :: asio。

当然,制作你自己也很有趣。

0

既然你提到C++ ...

如果你是一个Windows平台上,那么你应该看看I/O完成端口的这种可扩展性。 I/O完成端口允许您使用少量线程在套接字(和其他设备)上执行异步I/O,以服务数千个I/O操作(即连接)。

这样做的方式是,I/O完成端口本质上是一个队列,但操作系统优化了如何释放线程以处理该队列中的工作项目,以防止一次释放太多的线程并且确保刚刚使用的线程更有可能再次使用。请参阅:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx获取有关IOCP的MSDN信息,以及:http://www.serverframework.com/products---the-free-framework.html作为我的免费客户端/服务器框架的源代码,该框架使用IOCP的封面。

作为可扩展性的一个例子,在本博客文章(http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html)中,我详细介绍了如何使用760MB ram在Windows Server 2003计算机上实现超过70,000个并发连接。

请注意,C#异步套接字操作在底层使用IOCP。