SSLSocket bleibt bei getInputStream hängen, wenn sich das Android-Gerät im WLAN befindet

Ich möchte einen SSL-verschlüsselten TCP-Server auf dem Android-Gerät und einen Client auf dem Computer haben, der eine Verbindung zum Gerät herstellt.

Ich erstelle einen SSLServerSocket auf dem Android-Gerät mit einem eigenen Schlüsselspeicher.

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

Dann warte ich, bis ein Client eine Verbindung hergestellt hat. Wenn ein Client eine Verbindung herstellen möchte, wird ein neuer Thread gestartet und die Streams werden angefordert:

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

Zunächst habe ich diesen Code mit USB-Tethering verwendet, um eine Verbindung zwischen dem Computer und dem Android-Gerät herzustellen. Es wurde also kein WLAN / Netzwerk aktiviert. Alles hat perfekt funktioniert.

Dann habe ich das WLAN auf dem Android-Gerät aktiviert und eine Verbindung zu einem WLAN ohne Internet hergestellt. Aber jetzt scheint der Aufruf von getInputStream () 5 bis 10 Sekunden zu dauern. Wenn ich SSL deaktiviere, funktioniert es einwandfrei. Wenn das WLAN eine Verbindung zum Internet herstellt, tritt ebenfalls keine Verzögerung auf. Ich habe dies mit Android 4.2 und 5.1 getestet. Update: Jetzt konnte ich dieses Problem mit Android 6 testen. Und das Problem scheint dort behoben zu sein ...

The Handshake ist korrekt beendet, aber danach scheint es eine Art Verzögerung auf dem Android-Gerät zu geben. (Der Aufruf von getInputStream nimmt diese Zeit in Anspruch.) Einige Entwickler geben an, dass ein DNS-Reverse-Lookup durchgeführt wird, bei dem eine Zeitüberschreitung auftritt.

Werfen Sie einen Blick auf die Aufnahme, die erste Verbindung wurde hergestellt, während WLAN deaktiviert war. Die Datenübertragung dauerte 0,3 Sekunden. Dann habe ich gerade das WLAN aktiviert, ich habe keine Verbindung über das WLAN hergestellt, es kommuniziert immer noch über USB. Und es dauerte über 5 Sekunden.

Ich habe das Problem auch hier gefunden, aber sie verwenden einen Client-Socket. Ich brauche einen Server Socket. Hat jemand eine Idee, wie man dieses Problem behebt?

TLS-Verbindung mit SSLSocket ist unter Android OS langsam

Antworten auf die Frage(2)

Ihre Antwort auf die Frage