c# - 多人游戏大厅和配对系统的架构?

标签 c# http tcp udp unity3d

我希望设计一个玩家可以使用的系统

  1. 运行游戏,点击按钮进入竞技场,这会将他的 IP 地址/玩家配置文件/网络统计信息发送到服务器。

  2. 配对/大厅服务器将维护所有可用玩家的集合。它会不断寻找“匹配”的玩家对(算法现在不重要)。

  3. 当它发现两个排队的玩家“匹配”时,它会根据玩家资料数据选择其中一个玩家作为服务器,然后通知游戏客户端已找到匹配。根据客户端收到的通知,被选为服务器的客户端将启动服务器,其他玩家的客户端将在准备就绪时连接到已初始化的服务器。

设置它的好方法是什么?我的第一个想法是通过 HTTP POST 发送玩家统计数据。但在某些情况下,服务器可能需要几分钟才能找到匹配项并响应玩家将拥有的连接类型以及他们的对手是谁。 HTTP 适用于此吗?或者这应该是一个较低级别的基于定制套接字的方法?还是我完全离开这里?

P.S 该游戏正在 Unity 中开发。我更喜欢不仅仅是“这里有一个有效插件的链接”的答案,因为我有兴趣了解这通常是如何实现的背后的架构。

如有任何指导,我们将不胜感激。

最佳答案

我已经对这些类型的系统做了很多工作。如果我是你,我已经有一个 http 端点设置来处理这样的情况。在游戏中 http post/get 是一个糟糕的主意,但在用户界面中它确实不错。您可以每 5 秒轮询一次,或者让服务器告诉客户端何时再次询问。

您还可以使用 UDP 并来回发送 ping 来确定客户端是否已连接,而不是使用 timmy 进入 TCP 井(感觉很安全,但不要被头发骗了)。这样做的好处是开销比 http post/gets 少得多,缺点是碎片化和顺序(当然,如果你有一个正确的状态机,顺序就不会很重要)。

所以,考虑到所有这些,这里是我使用 http 的建议(同样可以通过一些调整使用 udp,但我会使用 http,因为那样我就不必进入碎片化的东西).

使用托管的 {insert framework here (WCF, WebAPI, aspx pages, php even)} 设置 IIS 服务器。

为了让生活更轻松,请为您需要的每个可能的 API 调用创建一个包装器类。

我想您想要的调用会是这样的(-> 表示服务器,<- 是来自 get/post 的 http 响应)。

  • 1 -> 你好(玩家数据。这是初始竞技场握手)
  • 1 个 R.1。 <- 欢迎(如果服务器喜欢玩家,这告诉他们他们已被接受)
  • 1 R.2。 <- 错误(该玩家因粗鲁行为被禁赛,没有适合您的游戏)
  • 2 -> FindMatch(对接会在他们说“你好”后立即开始寻找,这是在询问服务器是否找到任何东西。您还可以捆绑“预期等待时间”等统计信息。这充当 ping检查客户端是否还活着。对此的响应将作为对用户的 ping 通知,告诉他们他们仍然连接到服务器。您也可以实现一个单独的“ping”调用,这完全取决于您)
  • 2 R.1 <- NothingYet(我们什么也没找到,冷静下来等待)
  • 2 R.2 <- GotOne(我们找到了一个匹配。你会告诉客户他们是否应该在此时启动服务器或连接。)
  • 3 -> 离开(挥手告别牵线搭桥)

希望这对您有所帮助。就像我说的,你可以用 UDP 完成同样的事情。不过,我真的不会去研究 TCP(根据经验)。

关于c# - 多人游戏大厅和配对系统的架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22160991/

相关文章:

C# 修剪字符串短语法

http - 哪种服务器类型最适合 "validation server"?

屏幕锁定后,iOS 监听套接字成为错误的文件描述符

sockets - 如何使用 golang 进行 tcp syn 端口扫描?

java - 通过 TCP 套接字发送数据。这看起来合适吗?

c# - 从 IEnumerable<T> 集合中移除项目

c# - Linq 返回字符串数组

c# - 如何在 C# 中存储对属性的引用?

c++ - 如何在 winhttp 中检索特定站点和路径的 cookie

ios - 如何配置用于身份验证的 HTTP header ?