首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InetAddress.getAllByName()只接收带有java.net.preferIPv6Addresses的IPv4地址

InetAddress.getAllByName()只接收带有java.net.preferIPv6Addresses的IPv4地址
EN

Stack Overflow用户
提问于 2017-04-11 03:30:05
回答 1查看 1.3K关注 0票数 1

tl;dr

InetAddress.getAllByName()只接收IPv4地址列表,即使java.net.preferIPv6Addresses设置为true,在NAT64网络上,在iOS设备上也是如此。在连接到同一网络的android上,相同的代码可以正常工作。

这意味着,在ipv6专用网络中(根据苹果商店的要求),任何试图制作HttpURLConnection的应用程序都将失败,并将被苹果拒绝。

原邮政

我正在用Java为iOS创建一个应用程序,我使用HttpsURLConnection连接到服务器,在HttpsURLConnection网络上测试之前,一切都很正常。这个应用程序被苹果审查小组拒绝了,所以我正在使用NAT64网络进行本地测试。

要创建我的NAT64网络,我遵循以下步骤:支持IPv6 DNS64 64/NAT64 64网络

样本代码:

代码语言:javascript
复制
HttpsURLConnection testConn = null;
try {
    URL testUrl = new URL("https://google.com");
    testConn = (HttpsURLConnection) testUrl.openConnection();
    testConn.connect();     
}catch (Exception e){
    e.printStackTrace();
}finally {
    if(testConn != null){
        testConn.disconnect();              
    }           
}

在我的java.net.SocketException: Network is unreachable网络中,此代码在NAT64上失败。

我尝试过更改系统属性:

代码语言:javascript
复制
System.setProperty("java.net.preferIPv4Stack", "false");
System.setProperty("java.net.preferIPv6Addresses", "true");

我还尝试将网站设置为服务器以外的其他内容(如google.com测试代码中所示)。我还使用wireshark从wi连接中嗅探了数据包,唯一的流量是对google.com的DNS请求,它似乎不会失败。最后,我还尝试回到HttpURLConnection,以防问题与HTTPS有关。

同样值得注意的是,在测试中,iPhone可以安全地到达我们所有的服务器和域,并且该设备似乎具有稳定的和功能良好的互联网连接。当它连接到同一个NAT64网络时,这个应用程序在我的安卓设备上也会失败。

编辑:

设置System.setProperty("java.net.preferIPv6Addresses", "true");解决了android上的问题,所以现在这个问题被隔离到了iPhone5上的NAT64网络上。在这个阶段,我最好的猜测是,属性是由另一个类设置的,并且被忽略。我尝试在类顶部的静态初始化程序块中设置该属性,但没有成功。

编辑2:

我使用了System.getProperty("java.net.preferIPv6Addresses"),它在iPhone5上返回true,所以肯定是在设置它,这让我再次陷入困境。

编辑3:

我深入研究了HttpsURLConnection,它实现了一个PlainSocketImpl类来处理它的连接,它使用一个InetAddress。我决定测试一个InetAddress,当我在iPhone上调用InetAddress.getByName("google.com")时,我得到一个ipv4地址,而在android上,它返回的是一个ipv6地址。似乎java.net.preferIPv6Addresses属性在iOS上被忽略了。我尝试过将JDK更新为最新版本,但这并没有帮助。

我也刚刚尝试过InetAddress.getAllByName("www.google.com"),它只返回iPhone上的IPv4地址。我想说这显然是一个DNS问题,但是为什么在连接到同一个网络的android上不是一个问题呢?

因此,我现在知道问题是什么,但却不知道如何解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 21:48:32

解决方案是升级我的应用程序,以便在最新版本的MAF上运行。

详细信息:

尽管我已经将Eclipse和MAF更新为最新版本,但我的应用程序仍然使用它最初的MAF发行版作为目标运行时。通过查看目标SDK并意识到我无法更改运行时版本,我发现了这一点。

要更新,我必须创建一个新项目,确保将目标运行时设置为最新版本的MAF。然后,我将代码迁移到这个新项目中,并且能够在IPv6专用网络下成功地运行我的应用程序。

(在编写本报告时,MAF 2.3.2是Eclipse可用的最新版本)

如果有办法做到这一点而不创建一个新的项目,我无法发现它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43336277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档