6

我正在制作一个网络游戏(1v1),在游戏中它是 p2p - 不需要游戏服务器。

但是,为了让玩家能够“找到对方”,而不需要在另一个媒介中协调和输入 IP 地址(类似于现代网络游戏的时代),我需要一个协调/匹配服务器。

我不能使用常规的网络托管,因为:

  • 客户端将使用 UDP 进行通信。
  • 因此,我需要进行 UDP 打孔才能通过 NAT
  • 这将要求服务器以 UDP 通信并知道客户端的 IP 和端口
  • afaik 与常规网络托管 (php/etc) 我只能获取客户端的 IP 地址,并且只能通过 TCP (HTTP) 进行通信。

我目前正在考虑的选项:

  • 使用我的程序可以接受 UDP 连接的托管解决方案。(有什么建议吗?)

  • UDPonNAT似乎这样做,但使用 GTalk 并要求每个客户端都有一个 GTalk 帐户(这可能使其成为不合适的解决方案)

有任何想法吗?谢谢 :)

4

6 回答 6

3

除了让专用服务器运行您的代码之外,我没有看到任何其他选择。您提出的其他解决方案,容我们说,不是最优的。

如果您从小处着手,虚拟主机就可以了。成本非常低。

于 2009-07-22T11:41:49.063 回答
3

首先,让我说这超出了我的专业领域,但我发现自己很感兴趣,所以我一直在做一些搜索和阅读。

似乎最常用的 UDP NAT 穿越解决方案是使用STUN服务器。我做了一些快速搜索,看看是否有任何公司会直接为您提供 STUN 托管解决方案,但如果有的话,它们会被埋在简单的网络托管的成堆广告中。

幸运的是,似乎有几个 STUN 服务器已经启动并运行并且免费供公众使用。voip-info.org上有一个公共 STUN 服务器列表。

此外,如果您探索标记为“nat”的 SO 问题,还有更多信息。

于 2009-08-04T16:47:11.860 回答
2

与成熟的专用服务器不同,您只需获得廉价的共享托管服务并拥有与 PHP 页面的应用程序接口,后者又与 MySQL 数据库后端接口。

例如,Lunarpages有一个每月 3 美元的入门包,其中包括 5gb 的空间和 50gb 的带宽。对于这么简单的事情,这就是您所需要的。

然后,您只需让您的应用程序轮询网页以获取游戏列表,并提交 POST 请求以将自己的游戏添加到列表中。

当然,如果您还不了解 PHP 和 MySQL,则此方法需要学习它们。如果你做对了,你可以让 PHP 页面进入一种无限循环来保持连接打开并且只是向客户端提供更新,而不是每隔几秒钟轮询一次页面并浪费大量带宽。不过,这超出了此答案的范围。

哦,如果您正在寻找完全免费的东西,请搜索免费的 PHP 主机。那些也存在!即使使用支持广告的主机,您的应用程序也可以在解析游戏列表时抓取页面并忽略广告。我知道T35曾经是我的最爱之一,因为他们的免费计划不跟踪空间或带宽(它限制了每个文件的大小,以消除他们的服务被用作媒体共享,但这应该不是问题对于 PHP 文件)。但是,当然,我认为从长远来看,您最好选择付费主机。

编辑:T35 还说“免费托管允许托管 1 个域,而付费提供无限域托管。” 因此,您甚至可以支付一个域名并将其链接到他们!我认为在短期内,这是您最好(最便宜)的选择。当然,这一切都假设您知道或愿意学习 PHP 以实现这一目标。:)

于 2009-07-23T12:44:16.000 回答
1

每个网络连接都不会支持任何内容。STUN 可能很好,UPnP 可以解决这个问题。

然而,有传言说大多数防火墙都可以通过 UDP 端口 53 (DNS) 传递几乎任何东西。不过,您可能不得不与操作系统争论您对该端口的访问权限。

另外,请查看SIP,它是为此类事情设计的另一种协议。随着 VOIP 的普及,更多的防火墙可能对此提供了不错的内置支持。

如果您真的致力于 UDP,您还可以考虑通过 HTTP 建立隧道。

于 2009-08-04T21:40:50.223 回答
1

您如何将问题分成两部分 - 制作一个游戏匹配器客户端(与游戏不同),它可以通过 http 与您的廉价/共享网络主机通信。所有想要使用游戏匹配功能的游戏玩家都使用它。然后,游戏匹配器客户端在从您的服务器获取信息后使用正确的参数(IP 等)启动实际游戏。

然后游戏将根据您的网络代码使用标准方式通过 UDP 穿透 NAT 等。游戏实际上不需要知道任何关于匹配器客户端或匹配器服务器的信息——真正意义上的 p2p(就像种子一样,一旦你可以获得对等方的 IP,你甚至可以断开与跟踪器的连接)。

这样,你的问题就变小了。

于 2009-08-05T14:45:08.760 回答
0

托管您自己的专用服务器和严格的 P2P 网络环境之间的中间解决方案是 gnutella 模型。在该模型中,有一些超级节点充当本地服务器,具有已知的 IP 地址并连接到(并因此了解)比典型节点更多的客户端。这仍然需要您自己运行至少一个超级节点,但它让您可以选择让其他人运行他们自己的超级节点。

于 2009-07-23T13:04:57.440 回答