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

时间:2018-09-17 02:06:41

标签: c# multithreading sockets server udp

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

是否可以在所有线程上接收数据包并分析其是否对它们有用?这样会有效吗?我应该如何处理?

1 个答案:

答案 0 :(得分:1)

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

  1. I / O绑定的任务。换句话说,大多数情况下它等待一些I \ O 操作-网络响应,查询数据库或磁盘操作。在 在这种情况下,您可能需要一个异步模型, 连接在同一线程中处理。这样会很有效 因为实际上您自己的代码中没有太多工作要做。我想 您更有可能具有与I / O绑定的任务。例如,您只需要在播放器之间路由消息并从数据库中推\拉一些数据。所有路由消息都将具有游戏ID(在夹层之间),因此您将不会错过任何一个,也不会错过它们。看看this video,了解异步方法的思想和目标。

  2. CPU绑定的任务。在这里,服务器必须计算一些东西,执行繁重的算法或处理大量数据。在这种情况下,您可能需要多线程处理,但是每对玩家线程对也不是最合适的方法,因为它的可伸缩性不好并且占用了太多资源。如果您有一些繁重的CPU任务,请尝试与一组后台工作人员将它们排在队列中。然后以异步方式推送消息。看看producer-consumer implementation with BlockingCollection

您可能将两种情况结合在一起,当然,您可以结合使用上述方法。另请参阅问题123。尝试返回特定问题。希望对您有所帮助。