2014-03-27 69 views
4

我正在實現與套接字的TCP連接,我需要獲取服務器端的客戶端套接字的IP。我已經使用socketName.getRemoteSocketAddress()這確實返回IP地址後面跟着我使用的端口ID!我怎樣才能得到地址而不是端口?客戶端套接字 - 獲取IP -java

回答

4

這個返回的SocketAddress實際上是一個protocol-dependent subclass。對於網絡協議,如TCP在你的情況,你可以將其轉換爲InetSocketAddress

InetSocketAddress sockaddr = (InetSocketAddress)socketName.getRemoteSocketAddress(); 

然後你可以使用的InetSocketAddress的方法來得到你需要的信息,例如:

InetAddress inaddr = sockaddr.getAddress(); 

然後,您可以根據地址類型將其轉換爲Inet4AddressInet6Address(如果您不知道,請使用instanceof查找),例如如果你知道它是IPv4的:

Inet4Address in4addr = (Inet4Address)inaddr; 
byte[] ip4bytes = in4addr.getAddress(); // returns byte[4] 
String ip4string = in4addr.toString(); 

或者,更強勁的例子:

SocketAddress socketAddress = socketName.getRemoteSocketAddress(); 

if (socketAddress instanceof InetSocketAddress) { 
    InetAddress inetAddress = ((InetSocketAddress)socketAddress).getAddress(); 
    if (inetAddress instanceof Inet4Address) 
     System.out.println("IPv4: " + inetAddress); 
    else if (inetAddress instanceof Inet6Address) 
     System.out.println("IPv6: " + inetAddress); 
    else 
     System.err.println("Not an IP address."); 
} else { 
    System.err.println("Not an internet protocol socket."); 
} 
+0

只需使用您的第一條提示(編輯前)即可完美工作。謝謝! – Rakim

0
((InetSocketAddress)socketName).getAddress().toString() 

將返回類似:/10.255.34.132包含主機名,你可以,如果你不試試這個不想要主機名:

((InetSocketAddress)socketName).getAddress().toString().split("/")[1]