SSLSocket зависает при getInputStream, когда устройство android находится в wifi

Я хочу иметь SSL-шифрованный TCP-сервер на устройстве Android и клиент на компьютере, который будет подключаться к устройству.

Я создаю SSLServerSocket на устройстве Android с собственным хранилищем ключей.

final KeyStore localTrustStore = KeyStore.getInstance("BKS"); //NON-NLS
final InputStream in = context.getResources().openRawResource(R.raw.syncapp);
localTrustStore.load(in, "secret".toCharArray()); //Keystore pw
in.close();

final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //NON-NLS

final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(localTrustStore);

final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(localTrustStore, "secret".toCharArray()); //privat key pw

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

serverSocket = sslContext.getServerSocketFactory().createServerSocket(SERVER_PORT);
((SSLServerSocket) serverSocket).setNeedClientAuth(true);

Затем я жду, когда клиент подключится. Когда клиент хочет подключиться к новому потоку, запускается и запрашиваются потоки:

final DataInputStream input = new DataInputStream(this.clientSocket.getInputStream());
final DataOutputStream output = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));

Сначала я использовал этот код с USB-Tethering, чтобы получить соединение между компьютером и устройством Android. Таким образом, Wi-Fi/сеть не была включена. Все отлично работало.

Затем я активировал Wi-Fi на устройстве Android и подключился к wlan без Интернета. Но теперь вызов getInputStream(), кажется, занимает 5-10 секунд. Если я деактивирую SSL, он отлично работает. Если wlan подключается к Интернету, также нет задержки. Я тестировал это с помощью Android 4.2 и 5.1. Обновление: теперь я могу проверить эту проблему на Android 6. И проблема, похоже, там исправлена ​​...

Рукопожатие закончено правильно, но после этого, похоже, какая-то задержка на устройстве Android. (Вызов getInputStream потребляет это время) Некоторые разработчики говорят, что он сделает обратный поиск DNS, который будет работать в тайм-аут.

введите описание изображения здесь

Взгляните на захват, первое соединение было сделано, когда Wi-Fi отключен. Для передачи данных потребовалось 0,3 секунды. Затем я только активировал Wi-Fi, я не подключался через Wi-Fi, он все еще обменивается данными с USB. И потребовалось более 5 секунд.

Я тоже нашел эту проблему, но они используют клиентский сокет. Мне нужен серверный сокет. Кто-нибудь знает, как исправить эту проблему?

Соединение с TLS, использующее SSLSocket, медленнее в ОС Android

Ответ 1

Вы правы, что есть обратный DNS-поиск, который отключается. В некоторых средах среды Java Runtime, во время рукопожатия с необработанным IP-адресом, SSLContext без необходимости выполняет поиск IP-адреса сервера. Это необходимо, чтобы определить, совпадает ли общее имя сертификата сервера. Попробуйте использовать одно из упомянутых здесь решений:

Как отключить обратный DNS-поиск Java SSL