2010-10-17 123 views
1

我正在制作多人联网游戏。现在连接到服务器,客户端需要服务器的IP地址。用于自动搜索服务器的UDP广播

所以,我执行这个的方式如下。

客户在广播IP广播其IP地址和端口说A. 服务器通过听它,

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

Client是此连接的服务器和通过端口B.从服务器接收数据

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

bind: Address already in use

一个错误,这是什么的合理的解决方案?

回答

4

首先,让客户端广播它的地址听起来非常可怕,至少对我来说。广播意味着它只能在服务器位于本地子网的情况下才能正常工作,并且会造成大量不必要的流量对网络造成污染。

我希望客户端通过DNS服务发现(DNS-SD)找到服务器。这具有如下优点:只要您的服务器位于本地子网上,就可以使用multicast DNS,并且使用正常的受管理DNS过渡到广域服务器,而根本不需要对客户端进行任何更改。

二,服务器应该而不是专用线程给每个客户端。虽然这个型号可以使在某种程度上工作,但它有相当多的开销和缩放比例很差。

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