多线程 Udp 服务器:将接收到的数据重定向到线程
Posted
技术标签:
【中文标题】多线程 Udp 服务器:将接收到的数据重定向到线程【英文标题】:Multi Threaded Udp server : redirecting received data to threads 【发布时间】:2019-02-20 22:02:02 【问题描述】:所以我第一次为 1v1 游戏编写 udp 服务器和客户端。 我的想法是让服务器处理建立的第一个连接,并在每次 2 个新玩家连接时创建一个新线程来处理他们之间的所有通信。 典型的客户端消息将包含 threadIndex(我有一个线程数组)、playerId(它来自哪个玩家)以及它们需要完成的任何事情。
是否可以在所有线程上接收数据包并分析它是否适合它们?这会有效吗?我应该如何处理?
【问题讨论】:
【参考方案1】:合适的方法取决于服务器任务的性质,但为每对玩家创建一个新线程可能不是最好的主意。基本上让我们想象一下,您的服务器主要执行:
I/O 绑定任务。换句话说,大部分时间它都在等待一些 I\O opertiton - 网络响应,查询数据库或磁盘操作。在 这种情况下你可能需要异步模型,当你所有的 连接在同一个线程中处理。这将是有效的 因为您实际上在自己的代码中没有太多工作要做。我想 你更有可能有一些 I/O 绑定任务。例如,您只需要在玩家之间路由消息并从数据库中推送/拉取一些数据。所有路由的消息都会有一个游戏 ID(在到 plyers 之间),所以你永远不会错过任何一个,也不会错过它们。查看this video 了解异步方法的想法和目标。
CPU 绑定任务。在这里,服务器必须计算一些东西,执行繁重的算法或处理大量数据。在这种情况下,您可能需要多线程,但每个玩家对线程可能不是最合适的方法,因为它的可扩展性不好并且消耗太多资源。如果您有一些繁重的 CPU 任务,请尝试使用一组后台工作程序将它们排在队列中。然后以异步方式推送消息。看看producer-consumer implementation with BlockingCollection。
您可能有两种情况的组合,当然您可以结合上述方法。另请参阅问题1、2、3。尝试并返回具体问题。希望对您有所帮助。
【讨论】:
以上是关于多线程 Udp 服务器:将接收到的数据重定向到线程的主要内容,如果未能解决你的问题,请参考以下文章