如何在Android上连接到IPv6地址?

4
在Android上,我正在使用 HttpClient连接到一个网址,代码如下:
String url = "http://[fe80::1cef:49e7:2661:ffda]:7001/a.MOV";
HttpParams httpParameters = new BasicHttpParams();
HttpClient client = new DefaultHttpClient(httpParameters);
HttpGet httpGet = new HttpGet(url);
HttpResponse response = client.execute(httpGet);

当输入标准URL或v4 IP地址时,代码运行良好。然而,当我使用v6地址时,上述代码的最后一行将失败,抛出java.net.SocketException: Invalid argument

为了说明问题,比如这个地址:

http://192.168.1.2:7001/a.MOV

这个不会有问题:

http://[fe80::1cef:49e7:2661:ffda]:7001/a.MOV

完全不起作用。

为了确认,我还尝试使用较新的HttpURLConnection来建立连接,结果仍然抛出相同的异常。

目前我正在一台运行Android 3.2版本的Google TV设备上进行测试。

那么我是做错了什么吗?如果没有,有没有办法解决Android这个明显的限制?


4
当使用以“fe..:”开头的本地链接地址时,您需要指定要使用的链路。因此,它可能类似于http://[fe80::1cef:49e7:2661:ffda%eth0]:7001/a.MOV。如果可能的话,最好使用全局地址或ULA地址。 - Sander Steffann
3个回答

3

看起来随着我尝试更多的事情,情况似乎就是这样。有没有什么方法可以解决这种问题?还是我真的被卡住了? - yydl
我觉得你卡住了,因为你的安卓版本过旧,可能需要升级。 - Viswanath Lekshmanan

0

如果您改为从部分构建新的URL,那么您应该能够毫无问题地将其提供到您的HttpGet中。

您要查找的构造函数是:

new URL(java.lang.String, java.lang.String, int, java.lang.String)

(抱歉格式不好,我在用手机。)

[1]: http://developer.android.com/reference/java/net/URL.html#URL(java.lang.String, java.lang.String, int, java.lang.String)


不行,不起作用。我甚至尝试使用 InetAddress 创建一个套接字,但仍然无法工作(同样的错误)。 - yydl
如果你收到的SocketException错误仍然是无效参数,这似乎表明设备可能不支持IPv6。如果是连接问题,也许你的网络基础设施不支持IPv6? - Paul Lammertsma

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接