4

如何构建一个简单的 2 人游戏,通过 Internet 进行通信?

我需要解决以下问题:

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

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

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

进一步要求:

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

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

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

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

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

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


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

我可以使用 IM API 执行此操作吗?WCF?是否有适用于 Windows Messenger 的 WCF 频道?

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

你会使用什么消息格式?


编辑

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

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

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


回答

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

4

7 回答 7

3

每个两人游戏都必须具有某种类型的服务器环境,至少必须在两个客户端/玩家之间进行通信。请记住,每个客户端/播放器也可以充当自己的服务器来与其他链接的客户端进行通信。但是在任何给定时间密切关注所有客户端/播放器的需要以及促进搜索其他客户端/播放器的需要本质上需要某种类型的服务器环境开始。

于 2010-01-27T03:03:01.940 回答
3

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

使用 IRC 聊天室,您的客户“登录”到聊天室,并用于您的“存在”。聊天室中的任何人都“有空”玩游戏。

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

要解决的问题:

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

  • 平流量。基本上流程是您登录房间,您的客户端处于“可玩”模式。然后它会 ping 其他所有人,看看他们是否可以玩。这将在每个客户“登录”到聊天室时发生。然后,您可以使用公共房间播放“Frank 准备好玩新游戏”、“Frank 与 Joe 开始游戏”等活动。这有助于保持游戏同步而不是聊天,但当客户端连接到聊天时房间,它会去“大家好,我是鲍勃,你们都在做什么”。所以你需要管理它。

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

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

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

于 2010-01-27T04:53:35.760 回答
1

libpurple以及otr可以为您提供此类应用程序所需的 IM 隐私。

于 2010-01-27T03:01:31.837 回答
0

你有很多相互矛盾的要求。防火墙后面的两个客户端都阻塞了传入的请求,这意味着它们不能做对等 2 对等,因为两台机器都不能充当服务器,并且您需要在中间的某个地方有一个传输服务器,将消息路由到每个客户端。现在,鉴于没有服务器要求,您所要求的几乎是不可能的。

于 2010-01-27T03:06:13.667 回答
0

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

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

我现在可以告诉你,如果你编写一个 Web 服务来促进交流,你的生活会更快乐。但是,那么,您需要一台服务器。

祝你好运。你会需要它的。

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

于 2010-01-27T03:14:30.037 回答
0

正如有人所说,如果您在 2 个玩家之间没有任何中介服务器,则可能还无法这样做。由于您乐于使用第三方服务器,我建议您使用Google App Engine + XMPP over HTTP 构建系统。它在互联网上和防火墙后面工作得很好。但它是免费的(只要您的系统没有超出 GAE 配额)。

于 2010-01-27T03:30:45.477 回答
0

由于您的防火墙限制,点对点已退出。无论如何,这对于目录服务来说并不容易。

我将使用的下一个最简单的方法是在众多超级便宜的 Web 托管站点之一上折腾一个非常简单的 CGI 服务器脚本。看来你不想走这条路。有什么特别的原因吗?100 行代码和一个超级便宜的服务器应该可以满足您的所有要求,甚至更多。

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

这些都是杂牌。他们以迟钝、不优雅和扩展性差的方式完成工作。

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

于 2010-01-27T04:08:53.770 回答