iPhone在线多人游戏需要哪种类型的网络编程?

4

我在游戏编程问题系列中的一个小部分提出这个问题。

请参考这个问题作为主要问题。

现在假设我想在iPhone上开发游戏 - 一个简单的在线多人棋盘游戏。

假设它是一张赌场桌子。

在主问题中,ChrisF告诉我iPhone在线多人游戏的客户端 - 服务器架构。

我想知道我必须为此类型的应用程序执行什么样的网络编程。

客户端和服务器将承担哪些责任和活动。

您可以为我提供链接、教程或简洁明了的答案,任何帮助都将是巨大的帮助,并且将受到真正的赞赏。

谢谢


你好。首先,你并不总是需要一个服务器:如果你的项目是一款将由用户在同一房间内玩耍的游戏,你可以使用蓝牙,因此,你不需要连接到互联网的网络。因此,你可能需要通过回答问题来明确你的问题:玩家是否在同一房间内?因为如果你使用蓝牙或者在互联网上使用服务器,设计会有很大的不同。 - Joan Rieu
嗨FIfifox,我在上面的问题中只留下了一个单词“online”,我正在通过编辑问题来进行更正。 - harshalb
3个回答

4
你需要编写一个在服务器上运行的套接字应用程序。当你可以访问wifi接入点或edge/3g时,你可以从你的iphone应用程序向其发送数据。这个服务器可以处理传入的数据并向连接的人发送适当的回复。
关于服务器套接字编程,请参考这个指南 - http://beej.us/guide/bgnet/
关于iphone特定的套接字编程,请查看Iphone SDK提供的示例。这个链接也有一些基本信息。

嗨,chaoz,感谢你的回答,但我想知道客户端部分,即iPhone。哪些内容适用于iPhone网络编程? - harshalb

2

一个简单的在线多人棋盘游戏

考虑到iPhone并不总是连接互联网,您可能需要一个服务器来存储状态。或者您可以规定,如果一方失去连接,游戏结束。

对于后者,客户端到客户端会是显而易见的选择。两个客户端都有一个监听端口,并根据棋盘状态向另一个客户端发送命令。几乎所有在线游戏的显而易见选择都将使用UDP,因为它快速且紧凑。

对于服务器架构,当然需要某种服务器来侦听命令和游戏编号。它会在服务器上存储您的状态,例如mySQL数据库。这里,UDP甚至SOAP或JSON over HTTP都是两个显而易见的选择。

使用JSON/SOAP路线的第二种方法会更容易入手,假设iPhone有一个不错的JSON或SOAP库,但这不太可能实现。我不知道Objective C中的UDP,但在C中需要一定的知识水平,这不会让您快速获得可玩性。


谢谢@Chris S,我从你的回答中学到了很多东西。 - harshalb
1
你应该考虑到使用HTTP可能无法获得所需的性能;如果需要快速响应但高可靠性,请选择TCP套接字。 - Charles
SQLite是MySQL的轻量级替代方案。 - zooropa

2
正如你已经提到的,你需要一个服务器,但你可以有两种设计方案:
  • 服务器只能作为玩家之间连接的网关:它的两个用途是列出正在运行的游戏和列出玩家的 IP 地址,以便每个客户端都可以读取 IP 地址并连接到它们。这将需要更少的带宽和处理能力用于 Web 服务器,更多的处理能力用于托管游戏的客户端。在此配置中,其中一个客户端将充当服务器,并向其他客户端发送数据。如果你的游戏一次只有一个玩家玩,而不是很多玩家,那么这就是你应该使用的,因为你所支付的是服务器的能力。

  • 服务器还可以存储所有游戏的状态:这可能需要更多的处理能力和/或带宽,具体取决于你的游戏。

无论如何,大多数时候你只需要一个机器(可以在游戏过程中更改,如第一种情况)来进行处理,其他机器只需接收计算出的数据即可。

要编写网络游戏,你需要了解套接字(在第一种情况下需要深入了解,因为你将不得不处理 NAT 问题、路由器阻止客户端之间的通信等问题)。关于这方面的指南是 Beej's Guide to Network Programming,这是这个主题上的头号资源,尽管它并不专注于游戏。
如果 WWW 服务器上不需要太多的处理,你可以使用服务器脚本语言(如 PHP)以及 MySQL 来处理它,但你最有可能使用自己用 C++(或 C)编写的服务器。如果你使用 C++,你可能希望使用一个已经存在的库,比如 RakNet
客户端显然会使用 Objective-C 来编写,因为它是 iPhone 上的。我相信有一个很好的网络框架,考虑到在线游戏的数量,所以你可能也不想使用外部服务器网络库。
这可能对你想要做的事情有点过于复杂,但你也可以使用众所周知的 Torque Engine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接