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