多线程Udp服务器:将接收的数据重定向到线程

问题描述 投票:-1回答:1

所以我第一次为1v1的游戏编写了一个udp服务器和客户端。我的想法是让服务器处理第一次连接并在每次2个新玩家连接时创建一个新线程来处理它们之间的所有通信。典型的客户端消息将包含threadIndex(我有一个线程数组),playerId(它来自哪个播放器)以及他们需要做什么。

是否有可能在所有线程上接收数据包并分析它是否适用于它们?这会有效吗?我该怎么办呢?

c# multithreading sockets server udp
1个回答
1
投票

合适的方法取决于服务器任务的性质,但为每对玩家创建一个新线程可能不是最好的想法。基本上可以想象一下,您的服务器主要执行:

  1. I / O绑定任务。换句话说,大多数时候它等待一些I \ O opertiton - 网络响应,查询数据库或磁盘操作。在这种情况下,当您在同一个线程中处理所有连接时,您可能需要异步模型。它会很有效,因为你在自己的代码中实际上没什么可做的。我想你更有可能有一些I / O绑定任务。例如,您只需要在玩家之间路由消息并从数据库中推送\拉取一些数据。所有路由的消息都将具有游戏的ID(在玩家之间),因此您永远不会错过任何一个,并且他们不会被误导。看看this video,看看异步方法的想法和目标。
  2. CPU绑定任务。这里服务器必须计算某些东西,执行繁重的算法或处理大量数据。在这种情况下,您可能需要多线程,但每个玩家对的线程可能不是最合适的方法,因为它不是很好的可扩展性并且吃太多资源。如果您有一些繁重的CPU任务,请尝试使用一组后台工作程序将它们排在队列中。然后以异步方式推送消息。看看producer-consumer implementation with BlockingCollection

您可能有两种情况的组合,并且您可以结合上述方法。另见qazxsw poi,qazxsw poi,qazxsw poi等问题。尝试并返回具体问题。希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.