我有一个Java应用程序,要在其中接收已知子网中的udp广播电报,例如192.168.x.x(255.255.0.0)。如果我知道运行该应用程序的计算机的IP,则可以进行以下工作(假设计算机的IP为192.168.10.1)

InetAddress ip = InetAddress.getByName("192.168.10.1");
DatagramSocket socket = new DatagramSocket(2222, ip);

但是,如果IP是不固定的(也许是从dhcp服务器获得的),我如何创建一个套接字,该套接字绑定(bind)到机器从dhcp服务器获得的ip。其他子网中可能还有其他接口(interface),所以如果我要使用
DatagramSocket socket = new DatagramSocket(2222);

套接字不一定与192.168.x.x绑定(bind)到子网中的ip。

我该如何解决?

最佳答案

因此,如果我了解您的问题,那就是将地址分配给接口(interface)。我想您有一个以上的界面,并且想要选择一个。

还要注意,通过使用DatagramSocket socket = new DatagramSocket(2222);,您将绑定(bind)到通配符地址,该通配符地址通常意味着任意通配符地址,并且在许多情况下应该可以使用

从Oracle文档List Network interfaces中,您可以从不同的接口(interface)检索inetAddress。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;

public class ListNets {

    public static void main(String args[]) throws SocketException {
        Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
        for (NetworkInterface netint : Collections.list(nets))
            displayInterfaceInformation(netint);
    }

    static void displayInterfaceInformation(NetworkInterface netint) throws SocketException {
        out.printf("Display name: %s\n", netint.getDisplayName());
        out.printf("Name: %s\n", netint.getName());
        Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
        for (InetAddress inetAddress : Collections.list(inetAddresses)) {
            out.printf("InetAddress: %s\n", inetAddress);
        }
        out.printf("\n");
     }
}

10-05 22:57
查看更多