2014-03-27 193 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]