当绑定到“0.0.0.0”,如何找到我的Java的ServerSocket被绑定到实际的接口IP地址?

问题描述 投票:-1回答:1

所以我包围我的Java的ServerSocket为0.0.0.0。想象一下,我的机器有3个网络接口,每一个与自己的IP地址。现在我想以编程方式发现,我的客户端可以使用连接到我最近创建的ServerSocket的IP地址。呼叫:

serverSocket.getLocalSocketAddress()

要么

serverSocket.getInetAddress()

返回“0.0.0.0”,这当然是我不想要什么。

有任何想法吗?

java networking tcp serversocket
1个回答
2
投票

你不能从ServerSocket信息。你必须单独列举实际的接口,使用NetworkInterface.getNetworkInterfaces()NetworkInterface.getInetAddresses()

每Java文档中Listing Network Interface Addresses

一,你可以从一个网络接口获取信息的最有用件是分配给它的IP地址的列表。您可以通过以下两种方法之一获得从NetworkInterface实例这些信息。第一种方法,getInetAddresses(),返回EnumerationInetAddress。另一种方法,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
© www.soinside.com 2019 - 2024. All rights reserved.