如何在不创建服务器的情况下创建具有联系人和实时通信的多人游戏?

时间:2013-06-05 21:26:06

标签: c++ networking xmpp chat multiplayer

我想对我的项目有一些建议。我目前正在开发一个C ++ / Qt的音乐应用/游戏,采用多人游戏模式,我有以下要求(理想情况下):

  • 我希望能够与朋友建立联系,并能够与他们聊天和玩耍
  • 我需要向这些联系人发送/接收实时数据(音乐笔记)
  • 我不想创建服务器应用程序

你会建议做什么?

我正在考虑使用xmpp协议,因此我可以连接到google / jabber并检索联系人,与他们聊天。实际上这部分有效,但后来我不知道如何发送/接收实时数据。对于实时部分,我考虑使用直接TCP通信,但我需要知道我的联系人的外部IP,我不知道如何做到这一点。我想在每次连接时自动将我的外部ip和tcp端口发送到我的所有联系人,但我没有找到从代码中检索外部ip的解决方案。所以我有点卡住了。有什么建议吗?

有替代解决方案吗?替代协议?

谢谢你,
劳伦

1 个答案:

答案 0 :(得分:2)

出于现实,实用和性能方面的原因,您将很难避免编写服务器:

  1. 许多住宅互联网连接位于防火墙(在ISP,本地路由器或操作系统级别)后面,限制接受来自网络外部的连接。 NAT进一步使得在LAN上接受来自互联网的连接变得复杂。

  2. 互联网通信的方法很少,无服务器,而且需要使用本地对等发现来查找对等方。大多数LPD流量不会使其脱离您的局域网,ISP会对其进行过滤(否则您将能够“本地”发现整个互联网上的同行)。

  3. 带宽可能是游戏的关注点。并非所有人都拥有高速互联网连接(尽管此时光纤和快速DSL的市场渗透率非常高),并且您最终会遇到将较慢的主机连接到大型群体的问题。

  4. 服务器可以提供非常高效的星形网络。存在其他网络拓扑,但是许多网络拓扑具有严重抑制其扩展能力的缺点。

    • 例如,对于客户端,星形网络需要O(连接)= O(1),O(带宽)= O(1),O(等待时间)= O(1)。

    • 完全连接的网络需要连接每个客户端 每隔一个客户端,所以O(连接)= O(带宽)= O(n),和 O(延迟)= O(1)。

    • 在环网中,每个客户端连接到2个邻居和消息 远程客户端被转发。因此,他们有O(连接)= O(1),但O(带宽)= O(等待时间)= O(n)。

  5. 如果您只需要一个聊天系统,或者非常想要不想编写自己的服务器,而您愿意通过聊天服务器来捎带整个在线体验,那么您可能会依赖于像XMPP服务器这样的东西。 / p>

    如果您选择走这条路线,请确保在必要时使用正确的身份验证和加密来保护用户的私人数据(密码等)。我建议使用加密身份验证方案,允许客户端对其他客户端进行身份验证(例如质询/响应方案或其他方式)。或者,您可以使用中央服务调解所有身份验证。

    请记住,许多聊天服务都不希望为您的项目提供免费带宽。即使您决定使用XMPP作为多人游戏协议的核心,也希望运行自己的服务器。