Java 通过数据报套接字的网络发现:多播

Java 通过数据报套接字的网络发现:多播,java,multicast,datagram,Java,Multicast,Datagram,我正在实现一个示例,其中服务器侦听网络中的任何活动客户端 我正在为服务器使用数据报套接字来执行多播,并使用客户端来响应服务器 public void run() { try { byte[] recvBuf = new byte[15000]; DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); DatagramSocket dSock = new Da

我正在实现一个示例,其中服务器侦听网络中的任何活动客户端

我正在为服务器使用数据报套接字来执行多播,并使用客户端来响应服务器

public void run() {

    try {
        byte[] recvBuf = new byte[15000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        DatagramSocket dSock = new DatagramSocket(4445);
        dSock.receive(packet);
        int byteCount = packet.getLength();
        ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
        ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
        }
}

在客户方面:

public void run() {
    {
     ObjectOutputStream os = null;
        try {
            InetAddress address = InetAddress.getByName("Server's IP");//Note!
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000);
            os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
            os.flush();
              os.flush();
            byte[] sendBuf = byteStream.toByteArray();
            DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445);
            int byteCount = packet.getLength();
            }
     }
}

在上面的示例中,客户机必须知道服务器的IP apriori(硬代码)。如何修改服务器端的代码,以便服务器将其IP发送给客户端,客户端响应它

我可以使用套接字来实现这一点,但是可以使用数据报套接字吗

谢谢

您可以使用并回复发件人

返回发送此数据报或从中接收数据报的计算机的IP地址


尝试使用
InetAddress.getHostAddress
获取
hostAddress
,读取IP部分并将其传递给变量

InetAddress address = InetAddress.getByName("[variable]");


我希望这些都能带来更好的方式。

@peterlawrey-你是要我从服务器端获取IP并将其作为数据报发送到客户端?你的服务器和客户端没有数据报,只有发送方和接收方。接收者可以回复发送数据包的IP。好吧,我不明白。在没有显式发送的情况下,服务器如何知道客户端的IP?仅在DatagramPacket数据包之后=新DatagramPacket(sendBuf,sendBuf.length,address,4445);已执行(需要地址)我可以找到packet.getAddress。只有在从它接收数据包之后,您才知道另一端的IP。此时,您知道发送方IP.Multi-cast UDP用于服务发现,在使用它进行服务发现之前,不会发生任何自动操作。
InetAddress address = InetAddress.getByAddress("[variable]");