如何构建一个简单的 2 人游戏,通过互联网进行通信,并且在任何服务器上都没有自定义代码?

StackOverflow https://stackoverflow.com/questions/2144287

  •  23-09-2019
  •  | 
  •  

如何构建一个通过互联网进行通信的简单 2 人游戏?

我需要解决以下问题:

  • 查找或会合 - 两个玩家想要找到对方。

  • 持续的沟通。任一玩家都可以发起一项需要在相当快的时间范围内(IM 类型延迟,而不是电子邮件类型延迟)向另一方传递信息的操作。

在这方面,我认为它相当于双向聊天,人们希望能够找到对方,然后一旦配对,就可以进行相互交流。

进一步要求:

  1. 目前,假设端点是相对较新的 Windows 操作系统。

  2. 假设两个端点机器都不能直接从互联网访问。假设它们是客户端计算机,隐藏在阻止传入请求的防火墙后面。机器可以发出出站请求。(比如说,通过 HTTP,但 TCP 也可以)

  3. 沟通应该是私密的。为简单起见,假设已有一个共享密钥,并且端点能够执行 AES。我想我的意思是,任何中介都不需要解密消息包。解密仅发生在端点。

  4. 所有自定义代码应仅在客户端 PC 上运行。

  5. 假设互联网上没有受我控制的服务器。

  6. 我很乐意使用第三方服务器来促进相互通信,比如 IM 服务器什么的,只要它是免费的,而且我不需要在上面安装自定义代码。


有哪些 API 可用于促进此设计?

我可以使用 IM API 执行此操作吗?世界CF?Windows Messenger 是否有 WCF 通道?

什么协议?HTTP?我将其标记为“点对点”,但我的意思是 几乎;对于正式的 p2p 协议没有硬性要求。

您会使用什么消息格式?


编辑

为了澄清有关服务器的要求,我想要的是“我无法控制任何服务器”。任何服务器上都没有我的自定义代码。这与“无服务器”不同。

可以这样想:我可以使用我在发送端和接收端编写的自定义代码通过 SMTP 发送电子邮件。我的自定义代码可以通过免费的 SMTP 服务器中介进行连接。这不需要在 SMTP 服务器上安装代码。这正是我想要的,但由于延迟,SMTP 是不可接受的。

编辑2
我还发现了这个: 即时消息传递库,如 libpurple,但用 C# 编写


回答

我可以使用 IM 框架库做我想做的事。使用 Windows Live Messenger 执行此操作的一种简单方法是使用 Messenger 活动 SDK. 。这证明了这个概念,但并不是真正的通用解决方案。但是,可以使用各种消息系统的 IM 库(例如 libpurple)或使用 IRC 频道的库来完成类似的事情。在所有这些情况下,IM 服务器充当防火墙穿透通信基础设施。

有帮助吗?

解决方案

libpurple 随着 otr 可以为您提供这种应用程序所需的隐私。

其他提示

IM 是错误的工具。相反,请使用 IRC 聊天室。

通过 IRC 聊天室,您的客户“登录”到聊天室,这用于您的“存在”。聊天室中的任何人都“可以”玩游戏。

完成后,游戏实例通过聊天室相互通信。他们可以使用全球频道,或者只是私人 IRC 频道来获取游戏流量。

需要解决的问题:

  • 首先,所有游戏状态都在客户端上共享。许多游戏都做到了这一点(RTS 游戏如《帝国时代》,RPG 游戏如《暗黑破坏神》)。但附庸国很容易受到黑客攻击和欺骗。这只是一个简单的事实。如果游戏很受欢迎,它就会被黑客入侵。

  • Ping 流量。基本上流程是您登录到房间,您的客户端处于“可以玩”模式。然后它会向其他人发送 ping 信号,看看他们是否可以玩。每个客户端“登录”聊天室时都会发生这种情况。然后,您可以使用公共房间广播事件“Frank 准备好进行新游戏”、“Frank 与 Joe 开始游戏”等。这可以帮助保持游戏同步而不是喋喋不休,但是当客户端连接到聊天室时,它会说“大家好,我是鲍勃,你们都在做什么”。所以你需要管理它。

  • 交通量。IRC 房间可以处理大量流量,但不能处理大量流量。大多数都是为了防止“垃圾邮件”、“洪水”等而设计的。因此,您的游戏玩法可能会受到速率限制。对于“跳棋”来说这不是问题,对于 40 人 Raid 中的“魔兽世界”来说更是如此。这是游戏设计的问题。

  • 服务条款。IRC 提供商很可能会说“呃不,我们的服务不能做到这一点”。我没有研究过,所以我不知道,但可能是一个问题。

除此之外,IRC 非常适合。网上流传着很多 IRC 机器人代码,我从来没有使用过它们。

每个两人游戏都必须具有某种类型的服务器环境,因为至少必须在两个客户/播放器之间进行通信。请记住,每个客户/播放器也可以充当自己的服务器,与其他链接客户端进行通信。但是,需要在任何给定时间保留所有客户/播放器的标签,并且需要促进其他客户/播放器固有的搜索需要某种类型的服务器环境。

您可以在其中一个免费留言板服务器上设置留言板,以便玩家可以找到彼此。您可能希望鼓励他们使用私人消息来交换IP地址。然后,使用使用IP地址连接的协议。祝你好运。防火墙使它变得痛苦。

然后,当然,一对机器的一台机器需要充当服务器,另一台机器作为客户端。您的软件必须包含两组代码。我写了这样的游戏,可以告诉您通信代码有些混乱。

我现在可以告诉您,如果您写了一项网络服务来促进沟通,那么您的生活会更加快乐。但是,然后,您需要一台服务器。

祝你好运。您将需要它。

或者,您可以为IM客户端(例如Microsoft Messenger)编写游戏。我看过那个游戏,所以我知道可以做到。

正如某人所说的那样,如果您没有2个玩家之间的任何介导的服务器,则可能无法这样做。当您乐于使用第三方服务器时,我建议您使用 Google App引擎 + XMPP 超过http。它在互联网和防火墙后面都很好地工作。但是它是免费的(只要您的系统不从GAE配额中生长)。

由于您的防火墙约束,对等相处是出局。无论如何,这对目录服务并不容易。

我使用的下一个最简单的方法是将一个非常简单的CGI服务器脚本扔到众多超级便宜的Web托管网站之一上。看来您不想走这条路线。有一些特殊原因吗? 100行代码和超级便宜的服务器应该为您提供所需的一切以及更多。

我想您可以将某种类型的第三方聊天库挂钩。我不知道当前的IM协议,但是良好的旧IRC和您的游戏单独的频道将起作用。您甚至可以使用FTP拼凑一些东西。免费博客网站上的博客评论也将起作用。问题是为什么?

这些都是kludges。他们完成了钝,不高的缩放方式的工作。

我敦促您重新考虑Web服务器解决方案。

您有很多冲突的要求。防火墙阻止传入请求后面的两个客户都几乎意味着他们不能进行对等2对,因为这两个机器都不能充当服务器,并且您需要在中间的某个地方将消息路由到每个客户端。鉴于没有服务器的要求,您现在要问的几乎是不可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top