不,你不能。这就是为什么存在某种“代理”,可以使用硬编码信息(例如 URL)访问的集中式组件,其中可用资源的列表可用。因此,您需要一个中央服务器,可用的游戏服务器注册到该中央服务器,并且客户端可以获取该列表。
(除了硬编码,直接输入服务器名称到客户端代码,但是这样很无效,比如我要写一个局域网游戏,所以在运行游戏之前我们无法知道服务器名称)
为什么不直接询问用户他/她想连接到哪个服务器呢?
我有这个解决方案:当服务器创建时,它会监听谁连接到他们,然后发回服务器的名称。
我认为一旦客户端找到服务器,这没有任何用处。
编辑:我想我误读了这个问题。如果不需要在多个网段上工作(对于不在同一个 WiFi 或 LAN 上的参与者),那么关于多播的引用帖子可能是查找可用服务器的可行选项。
EDIT2:想添加为评论,但不适合...
我已经有 10 年或更长时间没有玩 LAN 游戏了,所以我可能对此有点不以为然,但我记得,一个玩家必须充当主持人,其他玩家加入游戏。这意味着,该播放器启动一个服务器(基本上侦听预定义的端口号),而其他播放器发送多播数据包以查找服务器。多播意味着网段上的每个人都会得到它,如果一个进程在那个端口上监听,并且有正确的软件支持,它就会响应。
因此,在这种情况下,请遵循@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