[英]C++ socket server architecture
我正在为我的实时游戏设计一个TCP套接字服务器,我已经采用了两种方法来构建它。 他们来了:
我们开始两个线程。 一个人在无限循环中侦听新连接,并将新客户端添加到数组中。 第二个顺序扫描阵列中的所有客户端套接字并从中读取数据。
我们启动一个线程,它在一个无限循环中侦听新连接,然后为每个只从一个套接字读取数据的客户端启动新线程。
我已经对大约100个客户端进行了一些测试,我看不出两种架构的性能差异。 所以,我想问你的意见,哪种方式更好。 谢谢!
这完全取决于你的游戏实际的实时性 。
在第一种方法中,您正在所有打开的套接字上实现事件的多路分解 - 并且可能使用select()
或poll()
来阻止。 显然,虽然您只能在被阻止的情况下收到事件通知,但如果在解除阻止时有多个事件被传递,您可以有效地序列化每个事件的处理。
在第二种方法中,您有可能并行处理事件(特别是在多处理器系统上),并且还可以使用线程优先级对连接进行优先级排序。 但是,这种方法使用更多内存,而调度线程比在第一种方法中迭代事件列表要昂贵得多。
您需要问自己的问题是:
在我看来,这取决于你认为对你更容易的。
你用升力吗? 如果是,您可以查看使用asio
实现此类服务器体系结构的示例。 这样,您可以在侦听连接和处理请求时避免手动管理线程。
ZeroMQ也是一个库,专门用于轻松实现服务器架构。 有了它,您可以通过显式控制线程数等来测试更详细的案例。
希望这可以帮助。
如果你想去WebSocket,这里有一个快速提示:查看https://github.com/zaphoyd/websocketpp和/或询问作者(Peter)。 WebSocket ++有一个非常灵活的框架,关于你的WebSocket处理的内容和方式。
根据经验,我将为新客户提供一个单独的线程,以便您可以处理登录,并让它等待加入游戏的好点。 我想你并不总是想要让新玩家登录游戏中断游戏。一个主线程可能会变得非常混乱。
您可能还希望线程组中的多个现有游戏线程具有可伸缩性,例如,如果您有8个以上的核心可用,则每个游戏一个。 考虑甚至从新游戏线程重定向到另一台服务器,以获得更大的可扩展性。
只需使用Boost.Asio即可开心! 学习一些示例并开始制作实际游戏,而不是网络基础知识。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.