创建PHP P2P游戏客户端跟踪器

时间:2013-05-02 18:47:46

标签: php c++ networking p2p

目前我正在研究使用P2P创建网络游戏。游戏节奏并不高,我无法访问专用服务器,因此P2P对我来说似乎是一个不错的选择。我有权访问在线域名。编程是用C ++完成的。

不知道游戏网络的危险我认为P2P不需要任何类型的集中式服务器通信。然后我想'但我怎么能在不知道他们的IP的情况下找到主持游戏的其他游戏用户呢?'。我现在的想法是,我需要某种中心“中心”,游戏可以连接到该中心以获得可用的对等主机及其IP和端口的列表。然后它将连接到该主机并使用UDP发送数据(我知道它是无连接的,但似乎ENet有一些技巧)。如果我的想法完全荒谬,请告诉我。

我有想法在我的在线域上制作一个非常简单的PHP客户端-IP-switch-thingy。游戏不会吸引超过2到3个人,因为这只是为了我个人的学习目标,所以我认为该域名的负载不会太大。问题是我无法找到任何有关使用PHP进行任何排序的有用信息。我试图查看SO的“类似问题”,但我仍然找不到很多信息。

我的问题是:如果可能的话,如何创建PHP游戏客户端/主机跟踪器?你知道任何好的网站或文章吗?

另一方面,我希望使用ENet和SFML的组合,ENet用于可靠的UDP数据包和SFML用于数据包构建器。这是一个可行的选择吗?

1 个答案:

答案 0 :(得分:2)

与往常一样,您可以选择多种选择。

使用P2P连接很棘手,但功能强大,尤其是在低延迟领域,如VOIP和多人在线游戏。

我认为您需要公开一个服务器来处理与连接的玩家相关的信息和状态。我建议将C++用于此部分,并使用boost::asio进行网络连接,因为您会发现使用这两个示例的许多解释良好的示例,您也可能会发现非常健壮且可扩展。但这最终还是取决于你。

此组件的作用是接受想要加入或创建游戏的玩家的传入连接。它将保留当前连接的游戏和用户列表,并将其提供给新来的玩家。

很简单,不是吗?现在,您需要对游戏架构做出选择。这里的选择是在玩家之间使用P2P连接,或者使用您的服务器作为每个玩家之间的代理。

服务器作为代理

保存有关每个游戏和玩家的信息的服务器可用于转发玩家之间的连接。这在可伸缩性和性能方面相当不利,因为您创建了一个单点故障,这是您的服务器,但由于您对此域的要求很低,它可能是您的选择。

在这种情况下,当玩家想要加入游戏并向所有其他玩家广播消息时,服务器可以接受新连接(例如在另一个套接字上),这样游戏中的每个人都可以在另一个玩家加入时接收广告,移动,射击......

点对点连接

这有点棘手。服务器将始终用于了解当前存在的玩家和游戏的目的,但不是负责管理用户之间的连接,而是可以简单地告诉想要加入游戏的玩家“嘿,你是即将加入新游戏,如果您愿意,请联系10.20.30.40“。这将是“托管”游戏的人的公共 IP地址。

然后你将遇到第一个大难题。如果他在路由器后面,你打算如何与这台主机通信?您需要在客户端实现NAT遍历功能,以允许传入的播放器进入其路由器之间托管游戏的计算机。

当VOIP应用使用UPnP's IGD (Internet Gateway Device)要求路由器打开并将某个端口重定向到所需计算机时,VOIP应用程序会使用某些技术来解决此问题(想想Skype)。这很棘手,因为它需要时间并且没有在每个路由器上实现,因此这可能会导致完全失败。为了这个例子,让我们说我们可以很容易地解决这个问题,让我们进入下一个问题。

当连接到计算机托管游戏时,您可以询问他还有哪些其他玩家也与游戏相关联,并向其他玩家展示您当前连接的游戏。 这里的想法是让比赛中的每个玩家互相谈论更新(再次,这将是移动,镜头,私人消息或其他),以保持每个玩家同步(并相信我他们不会) 。您可能还希望实现一种排序数据包算法(最好使用UDP或ENet),您可以在其中定义如何将广告和消息广播给其他玩家。

举例说明一场有4名球员的比赛。有一个主人 Bob Alice 他的邻居, Tom 一个住在纽约的人和 Mike 另一个人我们需要达到这个例子的目的。

爱丽丝首先连接鲍勃的游戏,她告诉鲍勃她加入了他的游戏,每次更新鲍勃和爱丽丝正在交换有关比赛当前状态的信息。现在汤姆进来并告诉鲍勃他是一名新球员,鲍勃告诉汤姆,还有另外一名球员连接并给了她她的IP地址(爱丽丝的)。现在鲍勃告诉爱丽丝有人已经连接并给了她自己的IP地址。想象鲍勃死了,鲍勃会告诉爱丽丝他死了,因为他在汤姆开始之前就习惯了与她交谈,而现在爱丽丝需要告诉汤姆鲍勃刚刚去世。

你可以简单地让所有玩家在每个广告中向每个玩家广播,但这将是一个相当大量的数据要处理,并且考虑到匹配中的玩家数量而不是那么可扩展。在P2P环境中使用图形进行通信可能会更有效,但肯定需要花费的时间远远超过几分钟才能解释。

我向您提供了关于这些技术的观点,如果您希望保持简单,使用经典的客户端 - 服务器架构,提供您需要处理的负载,它将超出可接受范围。

享受;)