1

我阅读了许多关于网络上 Java Socket 的示例,所有这些都与客户端代码的同一行:

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

因此,我们可以在同一台计算机上测试服务器和客户端。在 LAN 或 ad-hoc 中,如果客户端无法知道服务器的名称。(除了硬编码,直接输入服务器名称到客户端代码,但是这样很无效,比如我要写一个局域网游戏,所以在运行游戏之前我们无法知道服务器名称)

我有这个解决方案:当服务器创建时,它会监听谁连接到他们,然后发回服务器的名称。但是,我们又遇到了一个悖论:客户端无法连接到服务器来获取这些数据。

那么,如何克服这个困难的部分。(如果有使用其他java库的方法,也可以)。

4

1 回答 1

1

不,你不能。这就是为什么存在某种“代理”,可以使用硬编码信息(例如 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

于 2012-10-10T15:05:17.373 回答