我阅读了许多有关Java Socket on Network的示例,所有这些在客户端的代码中都包含以下内容:

sock = new Socket("localhost", PORT);

因此,我们只能在同一台计算机上测试服务器和客户端。在局域网或临时情况下,如果客户端无法知道服务器的名称。 (除了硬代码,直接将服务器名称输入到客户端代码,但这是非常无效的,例如,如果我要编写局域网游戏,那么在运行游戏之前我们无法知道服务器的名称)

我有关于此解决方案的信息:创建服务器时,它将监听将连接到他们的,然后发回服务器的名称。但是,同样,我们遇到了一个悖论:客户端无法连接到服务器以获取此数据。

因此,如何克服这一难题。 (如果有办法使用其他Java库,也可以)。

最佳答案

不,你不能。这就是为什么可以使用硬编码信息(例如URL)访问“经纪人”,集中式组件的原因,其中可用资源的列表可用。因此,您需要一个中央服务器,可用的游戏服务器注册到该中央服务器,并且客户端可以获取列表。



为什么不只问用户他/她想连接到哪个服务器呢?



我认为,一旦客户端找到服务器,就没有任何用处。

编辑:我想我误解了这个问题。如果不需要在多个网段上工作(对于不在同一WiFi或LAN上的参与者),则有关多播的引用帖子可能是查找可用服务器的可行选择。

EDIT2 :想要添加为评论,但不适合...

自从10年或更长时间以来,我一直没有玩过局域网游戏,因此我可能对此不太满意,但是我记得,一个玩家必须担任主持人,而其他玩家则加入了游戏。这意味着该播放器启动服务器(基本上监听预定义的端口号),而其他播放器发出多播数据包以查找服务器。多播意味着网段上的每个人都可以得到它,并且如果某个进程在该端口上进行监听并得到正确的软件的支持,它将进行响应。

因此,在这种情况下,请按照@MichaelB建议的指南进行操作:服务器应打开一个DatagramSocket,并等待某些内容到达,其他播放器应发送多播数据包。服务器应该发回一些东西,以确定在客户端可以识别哪种软件,它是否适合客户使用的服务器,或者其他东西恰好使用相同的端口...

发送不是,但是从套接​​字接收DatagramPacket有点违反直觉:

byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

收到数据包后,您可以致电:
SocketAddress remoteHostAddress = packet.getSocketAddress();

找出您的主机地址。

这应该有很好的帮助:Writing a Datagram Client and Server

10-05 22:43