特定の IP/ポートでリッスンしているサーバーがあります。彼らが開いたソケットは永続的であり、クライアントから CLOSE メッセージ、つまり ZERO バイトを受け取るまで閉じません。クライアントコードは次のとおりです。
java.net.URL url = new java.net.URL(Constants.URL);
urlConnection = (HttpsURLConnection) url.openConnection();
if(WelcomeScreen.mySslContext==null) {
WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory(); //reads the CA certificate and return the getSocketFactory context
}
urlConnection.setSSLSocketFactory(WelcomeScreen.mySslContext);
urlConnection.setReadTimeout(1000*15000);
urlConnection.setConnectTimeout(1000*20000);
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setUseCaches (false);
urlConnection.connect();
//Send Stream on server
OutputStream outStream = urlConnection.getOutputStream();
outStream.write(bytes);
outStream.flush();
outStream.close();
//Receive Stream from server
in = urlConnection.getInputStream();
in.close();
urlConnection.disconnect();
上記のコードが実行されると、実際に Android アプリを終了するまで、サーバーは CLOSE メッセージを受信しません。
サーバーがクライアントから CLOSE メッセージを取得して他のクライアントへの接続を解放するように、私が何をする必要があるか教えてください。
もう 1 つの観察結果は、上記のコードを再実行、つまりコピー アンド ペーストして、もう 1 つの要求を順番に送信しようとすると、最初に開いたソケットを再利用できることです。一方、条件を削除すると:
if(WelcomeScreen.mySslContext==null)
コードを強制的に実行します。
WelcomeScreen.mySslContext = GetsslContext.getSSLSocketFactory();
次に、新しいソケットを作成し、SSL ハンドシェイクを再度行います。これは正常な動作ですか?