0

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

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

你会建议做什么?

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

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

谢谢你,
劳伦特

4

1 回答 1

2

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

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

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

  3. 带宽可能是游戏的一个问题。并不是每个人都拥有高速互联网连接(尽管此时光纤和快速 DSL 的市场渗透率相当高),您最终会遇到将较慢主机连接到大型集群的问题。

  4. 服务器促进了非常高效的星型网络。存在其他网络拓扑,但许多都存在严重抑制其扩展能力的缺点。

    • 例如,对于客户端,星型网络需要 O(connections) = O(1)、O(bandwidth) = O(1) 和 O(latency) = O(1)。

    • 完全连接的网络要求每个客户端都连接到每个其他客户端,因此 O(connections) = O(bandwidth) = O(n) 和 O(latency) = O(1)。

    • 在环形网络中,每个客户端连接到 2 个邻居并转发远距离客户端的消息。因此,它们有 O(connections) = O(1),但 O(bandwidth) = O(latency) = O(n)。

如果您只需要一个聊天系统,或者非常不想编写自己的服务器,而您愿意通过聊天服务器搭载整个在线体验,那么您可能会依赖 XMPP 服务器之类的东西。

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

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

于 2013-06-05T21:59:21.170 回答