При привязке к «0.0.0.0», как найти фактический IP-адрес интерфейса, с которым был связан мой Java ServerSocket? - PullRequest
0 голосов
/ 08 февраля 2019

Итак, я ограничиваю свой Java ServerSocket до 0.0.0.0.Представьте, что у моей машины есть 3 сетевых интерфейса, каждый со своим IP-адресом.Теперь я хочу программно определить IP-адрес, который мои клиенты могут использовать для подключения к моему недавно созданному ServerSocket.Вызов:

serverSocket.getLocalSocketAddress()

или

serverSocket.getInetAddress()

Возвращает "0.0.0.0", что, конечно, мне не нужно.

Есть идеи?

1 Ответ

0 голосов
/ 09 февраля 2019

Вы не можете получить эту информацию от ServerSocket.Вы должны перечислить фактические интерфейсы отдельно, используя NetworkInterface.getNetworkInterfaces() и NetworkInterface.getInetAddresses().

Per Список адресов сетевого интерфейса в Javaдокументация:

Одна из наиболее полезных частей информации, которую вы можете получить от сетевого интерфейса, - это список 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
...