如何从ServerSocket获取IPv4?

时间:2011-12-11 22:35:51

标签: java android ip serversocket

在我的应用中,我创建了一个ServerSocket,并等待连接:

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

然后我尝试获取生成的套接字的远程IP:

socket.getInetAddress().getHostAddress();

但是,这似乎只返回一个IPv6地址。

出于我的目的,我相信我需要一个IPv4。有没有办法从套接字中获取IPv4地址?

3 个答案:

答案 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