【发布时间】:2014-05-06 14:53:54
【问题描述】:
我正在使用套接字实现 TCP 连接,我需要在服务器端获取客户端套接字的 IP。我使用了socketName.getRemoteSocketAddress(),它确实返回了IP地址,后跟我正在使用的端口ID!我怎样才能只得到地址而不是端口?
【问题讨论】:
我正在使用套接字实现 TCP 连接,我需要在服务器端获取客户端套接字的 IP。我使用了socketName.getRemoteSocketAddress(),它确实返回了IP地址,后跟我正在使用的端口ID!我怎样才能只得到地址而不是端口?
【问题讨论】:
这个返回的SocketAddress实际上是一个protocol-dependent subclass。对于 Internet 协议,例如您的 TCP,您可以将其转换为 InetSocketAddress:
InetSocketAddress sockaddr = (InetSocketAddress)socketName.getRemoteSocketAddress();
然后你可以使用InetSocketAddress的方法来获取你需要的信息,例如:
InetAddress inaddr = sockaddr.getAddress();
然后,您可以根据地址类型将其转换为Inet4Address 或Inet6Address(如果您不知道,请使用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.");
}
【讨论】:
((InetSocketAddress)socketName).getAddress().toString()
将返回类似 :/10.255.34.132 的内容,其中包含主机名,如果您不想要主机名,可以试试这个:
((InetSocketAddress)socketName).getAddress().toString().split("/")[1]
【讨论】: