SSLSocket зависает на getInputStream, когда Android-устройство находится в Wi-Fi
Я хочу иметь TCP-зашифрованный SSL-сервер на устройстве 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