Я хочу иметь 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