簡體   English   中英

如何從ServerSocket獲取IPv4?

[英]How do I get the IPv4 from a ServerSocket?

在我的應用程序中,我創建一個ServerSocket ,並等待連接:

while(isRunning) {
    try {
        socket = serverSocket.accept();

然后,我嘗試獲取生成的套接字的遠程IP:

socket.getInetAddress().getHostAddress();

但是,這似乎僅返回一個IPv6地址。

就我的目的而言,我認為我需要一個IPv4。 有什么方法可以從套接字獲取IPv4地址嗎?

不知道是否為時已晚,但是這段小代碼可以解決您的問題。 我今天遇到了同樣的問題,發現了這一點:

private String getLocalIpAddress() {
   try {
       for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
           NetworkInterface intf = en.nextElement();
           for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
               InetAddress inetAddress = enumIpAddr.nextElement();
               if (!inetAddress.isLoopbackAddress()) {
                   if (inetAddress instanceof Inet4Address) {
                       return ((Inet4Address)inetAddress).getHostAddress().toString();
                   }
               }
           }
       }
   } catch (SocketException ex) {
       Log.e("ServerActivity", ex.toString());
   }
   return null;
}

重點是測試IP地址是否真的是IP V4地址。

玩得開心

如果客戶端已連接到IPv6地址(即,如果您的服務器是IPv6托管的),那么您將只有IPv6地址。 您還需要在(或代替)IPv4空間中托管服務器,然后讓客戶端連接到IPv4地址,以獲取客戶端的IPv4地址。

您可能可以通過DNS進行查找,但這並不可靠(即,對IPv6地址進行反向查找以獲取主機名,然后進行正向查找,在主機上查找A記錄)。 假設已為該地址設置了反向DNS,但不能保證。

盡管某些IPv6地址映射到IPv4范圍,但由於IPv6地址比IPv4地址多,因此無法將所有IPv6都轉換為IPv4。 Oracle有一個非常好的文檔,解釋了IPv6和IPv4以及它如何影響Java和網絡。 您還應該簽出InetAddress API文檔。 我在下面都鏈接了:

http://docs.oracle.com/javase/1.4.2/docs/guide/net/ipv6_guide/

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/InetAddress.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM