Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从服务器套接字获取IPv4?_Java_Android_Ip_Serversocket - Fatal编程技术网

Java 如何从服务器套接字获取IPv4?

Java 如何从服务器套接字获取IPv4?,java,android,ip,serversocket,Java,Android,Ip,Serversocket,在我的应用程序中,我创建了一个ServerSocket,并等待连接: while(isRunning) { try { socket = serverSocket.accept(); 然后,我尝试获取结果套接字的远程IP: socket.getInetAddress().getHostAddress(); 但是,这似乎只返回一个IPv6地址 就我而言,我相信我需要一个IPv4。是否有某种方法可以从套接字获取IPv4地址?如果客户端已连接到IPv6地址,即,如果您的服务

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

while(isRunning) {
    try {
        socket = serverSocket.accept();
然后,我尝试获取结果套接字的远程IP:

socket.getInetAddress().getHostAddress();
但是,这似乎只返回一个IPv6地址


就我而言,我相信我需要一个IPv4。是否有某种方法可以从套接字获取IPv4地址?

如果客户端已连接到IPv6地址,即,如果您的服务器是IPv6托管的,则您将只拥有IPv6地址。您还需要将服务器托管在IPv4空间中,或者代替,然后让客户端连接到IPv4地址以获取客户端的IPv4地址


您可能可以通过DNS进行查找,但这并不可靠,即,对IPv6地址进行反向查找以获取主机名,然后进行正向查找,查找主机上的记录。这假设已为该地址设置了反向DNS,但这并不保证。

如果客户端已连接到IPv6地址,即如果您的服务器是IPv6托管的,则您将只拥有IPv6地址。您还需要将服务器托管在IPv4空间中,或者代替,然后让客户端连接到IPv4地址以获取客户端的IPv4地址


您可能可以通过DNS进行查找,但这并不可靠,即,对IPv6地址进行反向查找以获取主机名,然后进行正向查找,查找主机上的记录。这假定已为地址设置了反向DNS,但这并不保证。

虽然某些IPv6地址映射到IPv4范围,但不可能将所有IPv6转换为IPv4,因为IPv6地址多于IPv4地址。Oracle有一份非常好的文档,解释了IPv6和IPv4及其对Java和网络的影响。您还应该查看InetAddress API文档。我已将这两个链接如下:


虽然某些IPv6地址映射到IPv4范围,但不可能将所有IPv6转换为IPv4,因为IPv6地址多于IPv4地址。Oracle有一份非常好的文档,解释了IPv6和IPv4及其对Java和网络的影响。您还应该查看InetAddress API文档。我已将这两个链接如下:


不知道是否太晚了,但这段代码可以解决您的问题。 我今天也遇到了同样的问题,我发现:

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地址


玩得开心

不知道是否太迟了,但这段代码可以解决您的问题。 我今天也遇到了同样的问题,我发现:

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地址


玩得开心

你认为你需要IPv4的目的是什么?@ChrisCashwell我正在将生成的IP传递给MediaPlayer,我认为它无法处理v6。你认为你需要IPv4的目的是什么?@ChrisCashwell我正在将生成的IP传递给MediaPlayer,我认为它无法处理v6。你还需要将服务器托管在IPv4空间中,或者而不是,-你知道我会怎么做吗?这是一个监听服务器IPv4地址的例子。如果服务器只有IPv6地址,则这是不可能的。否则,就需要监听所有端口。您是如何创建ServerSocket的?默认情况下,它会侦听所有IP地址,除非您在创建对象时明确提供了IP地址。我使用的是ServerSocket ServerSocket=new ServerSocketport,我相信它会侦听所有IP。我还知道服务器实际上同时具有IPv6和IPv4。尽管如此,我认为客户端总是选择连接到IPv6;如果您无法控制客户端源代码,则这将意味着以某种方式摆弄系统配置,因为即使Windows也更喜欢IPv6而不是IPv4。您还需要将服务器托管在IPv4空间中,或者,-您知道我将如何做到这一点吗?这是一种监听服务器IPv4地址的情况。如果服务器只有IPv6地址,则这是不可能的。否则,就需要监听所有端口。您是如何创建ServerSocket的?默认情况下,它会侦听所有IP地址,除非您在创建对象时明确提供了IP地址。我使用的是ServerSocket ServerSocket=new ServerSocketport,我相信它会侦听所有IP。我还知道服务器实际上同时具有IPv6和IPv4。尽管如此,我认为客户端总是选择连接到IPv6;如果您无法控制客户端源代码,那么这将意味着以某种方式摆弄系统配置,因为即使是Windows也更喜欢IPv6而不是IPv4。在我的情况下,我的路由器声称连接到我的serversocket的客户端恰好有IPv4。这在哪里合适?为什么你必须有一个IPv4?我从你对这个问题的评论中看到,你不相信MediaPlayer支持这个问题
IPv6。这是否意味着如果客户端有IPv6地址,您的应用程序本身就不支持它?假设是这样的话,我无法控制它。MediaPlayer似乎让我别无选择。我假设大多数路由器为每个人分配两个IP,因此,由于我的客户端通常在本地网络上,所以它们应该有一个可用的IP。至少在我的测试案例中是这样的。在我的案例中,我的路由器声称连接到我的serversocket的客户端碰巧有IPv4。这在哪里合适?为什么你必须有一个IPv4?我从你对这个问题的评论中看到,你不相信MediaPlayer支持IPv6。这是否意味着如果客户端有IPv6地址,您的应用程序本身就不支持它?假设是这样的话,我无法控制它。MediaPlayer似乎让我别无选择。我假设大多数路由器为每个人分配两个IP,因此,由于我的客户端通常在本地网络上,所以它们应该有一个可用的IP。至少在我的测试案例中是这样的。我认为你不理解这个问题。我不需要本地ip。我需要连接到我的服务器socketi的客户端的ip。我认为您不理解这个问题。我不需要本地ip。我需要连接到serversocket的客户端的ip