我想对我的项目有一些建议。我目前正在开发一个C ++ / Qt的音乐应用/游戏,采用多人游戏模式,我有以下要求(理想情况下):
你会建议做什么?
我正在考虑使用xmpp协议,因此我可以连接到google / jabber并检索联系人,与他们聊天。实际上这部分有效,但后来我不知道如何发送/接收实时数据。对于实时部分,我考虑使用直接TCP通信,但我需要知道我的联系人的外部IP,我不知道如何做到这一点。我想在每次连接时自动将我的外部ip和tcp端口发送到我的所有联系人,但我没有找到从代码中检索外部ip的解决方案。所以我有点卡住了。有什么建议吗?
有替代解决方案吗?替代协议?
谢谢你,
劳伦
答案 0 :(得分:2)
出于现实,实用和性能方面的原因,您将很难避免编写服务器:
许多住宅互联网连接位于防火墙(在ISP,本地路由器或操作系统级别)后面,限制接受来自网络外部的连接。 NAT进一步使得在LAN上接受来自互联网的连接变得复杂。
互联网通信的方法很少,无服务器,而且需要使用本地对等发现来查找对等方。大多数LPD流量不会使其脱离您的局域网,ISP会对其进行过滤(否则您将能够“本地”发现整个互联网上的同行)。
带宽可能是游戏的关注点。并非所有人都拥有高速互联网连接(尽管此时光纤和快速DSL的市场渗透率非常高),并且您最终会遇到将较慢的主机连接到大型群体的问题。
服务器可以提供非常高效的星形网络。存在其他网络拓扑,但是许多网络拓扑具有严重抑制其扩展能力的缺点。
例如,对于客户端,星形网络需要O(连接)= O(1),O(带宽)= O(1),O(等待时间)= O(1)。
完全连接的网络需要连接每个客户端 每隔一个客户端,所以O(连接)= O(带宽)= O(n),和 O(延迟)= O(1)。
在环网中,每个客户端连接到2个邻居和消息 远程客户端被转发。因此,他们有O(连接)= O(1),但O(带宽)= O(等待时间)= O(n)。
如果您只需要一个聊天系统,或者非常想要不想编写自己的服务器,而您愿意通过聊天服务器来捎带整个在线体验,那么您可能会依赖于像XMPP服务器这样的东西。 / p>
如果您选择走这条路线,请确保在必要时使用正确的身份验证和加密来保护用户的私人数据(密码等)。我建议使用加密身份验证方案,允许客户端对其他客户端进行身份验证(例如质询/响应方案或其他方式)。或者,您可以使用中央服务调解所有身份验证。
请记住,许多聊天服务都不希望为您的项目提供免费带宽。即使您决定使用XMPP作为多人游戏协议的核心,也希望运行自己的服务器。