在我的应用中,我创建了一个ServerSocket
,并等待连接:
while(isRunning) {
try {
socket = serverSocket.accept();
然后我尝试获取生成的套接字的远程IP:
socket.getInetAddress().getHostAddress();
但是,这似乎只返回一个IPv6地址。
出于我的目的,我相信我需要一个IPv4。有没有办法从套接字中获取IPv4地址?
答案 0 :(得分:1)
不知道是否为时已晚,但这段小代码可以解决您的问题。 我今天遇到了同样的问题,发现了这个问题:
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地址。
玩得开心
答案 1 :(得分:0)
如果客户端已连接到IPv6地址(即,如果您的服务器是IPv6托管的),那么您将只拥有IPv6地址。您还需要在IPv4空间中托管服务器(或代替),然后让客户端连接到IPv4地址以获取客户端的IPv4地址。
您可以通过DNS进行查找,但这不可靠(即,反向查找IPv6地址以获取主机名,然后进行正向查找,在主机上查找A记录)。这假设已经为地址设置了反向DNS,但这并不能保证。
答案 2 :(得分:-1)
虽然某些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