Android и IPv6 в Java

Я разрабатываю приложение для Android, и мне нужно использовать IPv6 для подключения к серверу.

IPv6 включен на телефоне, и я вижу свой локальный IPv6-адрес с ip addr. Я также могу успешно использовать ping6 мой телефон с ПК и наоборот.

Но я пытаюсь получить локальные адреса на Android с помощью команды Java NetworkInterface.getNetworkInterfaces() Я получаю только адреса IPv4.

Я также попытался открыть клиентский сокет, но строка Socket s = new Socket(MYSERVERIPV6ADDRESS, PORT); всегда выбрасывает java.net.SocketException: Invalid argument. Я уверен, что адрес правильный, потому что я пробовал с тем же кодом на своем компьютере и отлично работает.

Кажется, что IPv6 поддерживается операционной системой, но не виртуальной машиной Java. Есть ли способ решить эту проблему?

Ответ 1

Используйте этот статический метод в Inet6Address, чтобы получить объект Inet6Address для вашего адреса,

Inet6Address getByAddress (хост строки, byte [] addr, int scope_id)

затем используйте следующий конструктор сокетов, чтобы получить сокет,

Socket (InetAddress dstAddress, int dstPort).

Ответ 2

Поддержка IP6 - это выбор поставщика, который, к моему мнению, включает поддержку.

Я предполагаю, что вы тестируете свое приложение в эмуляторе. Посмотрев, как работает Android, http://developer.android.com/guide/developing/devices/emulator.html#emulatornetworking Это за маршрутизатором IPv4, адресованным 10.0.2.1. Следовательно, вы не можете открыть Socket с помощью IPv6. Все зависит от того, существует ли путь от всех маршрутизаторов, совместимых с IPv6, от вашего телефона до места назначения.