SSLSocket trava em getInputStream quando o dispositivo Android está no wifi

Quero ter um servidor TCP criptografado SSL no dispositivo Android e um cliente no computador que se conectará ao dispositivo.

Eu crio um SSLServerSocket no dispositivo Android com um próprio keystore.

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);

Então eu espero que um cliente se conecte. Quando um cliente deseja conectar-se, um novo encadeamento é iniciado e os fluxos são exigidos:

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

Primeiro, usei esse código com o USB-Tethering para obter uma conexão entre o computador e o dispositivo Android. Portanto, nenhum Wifi / Rede foi ativado. Tudo funcionou perfeitamente.

Então eu ativei o wifi no dispositivo Android e me conecte a uma WLAN sem internet. Mas agora a chamada para getInputStream () parece levar de 5 a 10 segundos. Se eu desativar o SSL, ele funcionará perfeitamente. Se a WLAN se conectar à Internet, também não haverá atraso. Eu testei isso com o Android 4.2 e 5.1. Atualização: Agora eu poderia testar esse problema com o Android 6. E o problema parece estar corrigido lá ...

O Handshake foi concluído corretamente, mas depois disso parece haver algum tipo de atraso no dispositivo Android. (A chamada para getInputStream consome esse tempo) Alguns desenvolvedores estão dizendo que fará uma pesquisa inversa de DNS que ocorrerá com o tempo limite.

Dê uma olhada na captura, a primeira conexão foi feita enquanto o wifi estava desativado. Demorou 0,3 segundos para fazer a transferência de dados. Então eu acabei de ativar o wifi, não conectei pelo wifi, ele ainda se comunica via usb. E levou mais de 5 segundos.

Encontrei o problema aqui também, mas eles estão usando um soquete de cliente. Eu preciso de um soquete de servidor. Alguém tem alguma idéia de como corrigir esse problema?

A conexão TLS usando SSLSocket é lenta no sistema operacional Android

questionAnswers(1)

yourAnswerToTheQuestion