1

我正在编写一个简单的多人 2d 游戏,确切地说是 4 人 Pong。

游戏开始时 有一个开始菜单,您可以在其中选择主持或加入游戏。4 名玩家中的一名必须主持,另外 3 名将加入。我可以在房间对面对我的其他 3 位好友大喊大叫,并告诉他们我的 ip 和端口号,但我想知道是否有办法代替搜索主机。对我来说这听起来不可能,互联网上有数百万台计算机,我怎么可能找到一台正在等待我的电话的计算机。我知道星际争霸曾经在 90 年代中期这样做过。

我有一个关于如何实现这一目标的理论。那就是使用像 sql 这样的数据库来跟踪当前谁在托管。这将是数据库的唯一用途,因为我不保留用户统计信息或任何东西。

有一个更好的方法吗?

4

4 回答 4

3

假设您在 LAN 上,您可以使用 UDP 来发现客户端。

如果客户端充当主机,它会侦听 UDP 数据报。如果它收到一个包含发现请求的请求,它会用它的 IP、端口和客户端需要的任何其他信息进行响应。(您可以包括连接的玩家数量等)

如果客户端充当客户端,它会在“加入游戏”屏幕上发送发现数据报。当主机响应时,它们被添加到选择列表中。

当用户选择服务器时,使用您在发现响应中收到的 IP 和端口,通过 IP 进行连接。

Lidgren 网络库提供了一些可能有用的不错的发现功能。

如果您不在 LAN 上,您将需要某种可全球访问的中央目录 - 可能在网站上。当有人开始新游戏时,他们的客户端会在目录中注册他们的 IP 等。然后,客户端将轮询该站点以获取服务器列表,然后将其用于填充“加入游戏”屏幕。

值得注意的是,服务器/目录方法在 LAN 环境中的效果与在 Internet 上的效果一样好。UDP 更灵活,因为它不需要客户端对目录提供者有任何了解,因为它基本上会为您“在房间里大喊大叫”。

于 2012-06-21T18:28:40.263 回答
2

您需要一个中央代理来识别那些托管和参与的人。

您可能还希望通过同一主机传递游戏流量,因为在打开端口和在其他防火墙后面的远程计算机之间传递直接流量等方面存在很多问题。此外,如果您保持流量集中,您可以放置在一些制衡中反对作弊。

于 2012-06-21T18:23:57.917 回答
1

在 Internet 上使用某种可以写入文件的服务器(web/ftp)。当您托管游戏时,将 IP 和端口写入文件中。当客户想要加入游戏时,函数可以检查文件并读取它。这只是首先想到的。

于 2012-06-21T18:20:30.950 回答
1

如果这仅用于 LAN,则每个客户端都可以将 UDP 广播发送到网络子网的广播地址。

主机(或其他客户端)侦听相同的 UDP 端口。

于 2012-06-21T18:25:17.737 回答