3

我正在制作多人网络游戏。现在要连接到服务器,客户端需要服务器的 IP 地址。

所以,我实现它的方式如下。

客户端在广播 IP 和端口广播其 IP 地址,例如 A。服务器通过 A 监听它,并且

服务器与客户端创建一个新的 UDP 连接,客户端通过端口 B 表示客户端的行为。它发送游戏所需的所有重要信息,包括其 IP。

客户端是此连接的服务器,并通过端口 B 从服务器接收数据。

现在,A 和 B 是常数。因此,当我需要服务器在不同线程中侦听多个客户端时,我可以将线程的差异值放入 A 和 B,但在客户端文件中,A 和 B 独立于这些线程。所以它给了我一个错误

bind: Address already in use

什么是合理的解决方案?

4

1 回答 1

5

首先,让客户端广播它的地址听起来很可怕,至少对我来说是这样。广播意味着它只有在服务器位于本地子网上时才能工作,并且会用大量不必要的流量污染网络。

我会让客户端通过 DNS 服务发现 ( DNS-SD ) 找到服务器。这样做的好处是,只要您的服务器位于本地子网上,您就可以使用多播 DNS,并使用普通管理的 DNS 转换到广域服务器,而根本不需要对客户端进行任何更改。

其次,服务器不应该每个客户端指定一个线程。虽然这个模型可以在某种程度上工作,但它有相当多的开销并且扩展性非常差。

最后,对于(我认为是)您最初的问题:我不会为每个客户端使用不同的端口,而是为所有客户端提供一个端口。来自客户端的每个请求都将携带足够的信息,供服务器执行它包含的任何请求。服务器只是在其单个端口上侦听,并在每个请求到达时为其提供服务。您可能为此专门分配了多个线程,但它应该是一个通用线程池——即,所涉及的线程数量只是配置问题,对整体设计没有逻辑意义(即,特定线程的身份)线程没有任何意义——如果你迁移到一个拥有 8 倍人核的更大服务器,添加更多线程只是配置更多线程的简单问题,而不是改变整体设计)。

于 2010-10-17T17:32:22.887 回答