所以我包围我的Java的ServerSocket为0.0.0.0。想象一下,我的机器有3个网络接口,每一个与自己的IP地址。现在我想以编程方式发现,我的客户端可以使用连接到我最近创建的ServerSocket的IP地址。呼叫:
serverSocket.getLocalSocketAddress()
要么
serverSocket.getInetAddress()
返回“0.0.0.0”,这当然是我不想要什么。
有任何想法吗?
你不能从ServerSocket
信息。你必须单独列举实际的接口,使用NetworkInterface.getNetworkInterfaces()
和NetworkInterface.getInetAddresses()
。
每Java文档中Listing Network Interface Addresses:
一,你可以从一个网络接口获取信息的最有用件是分配给它的IP地址的列表。您可以通过以下两种方法之一获得从
NetworkInterface
实例这些信息。第一种方法,getInetAddresses()
,返回Enumeration
的InetAddress
。另一种方法,getInterfaceAddresses()
,返回java.net.InterfaceAddress
实例的列表。当你需要约超过其IP地址的接口地址的详细信息使用此方法。例如,您可能需要对子网掩码和当地址是IPv4地址,广播地址,并在IPv6地址的情况下,网络前缀长度的附加信息。下面的示例程序列出机器上所有的网络接口和他们的地址:
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"); } }
以下是从例如程序输出样本:
Display name: TCP Loopback interface Name: lo InetAddress: /127.0.0.1 Display name: Wireless Network Connection Name: eth0 InetAddress: /192.0.2.0