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, от вашего телефона до места назначения.