0

特定の 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 ハンドシェイクを再度行います。これは正常な動作ですか?

4

1 に答える 1

0

彼らが開いたソケットは永続的であり、クライアントから CLOSE メッセージ、つまり ZERO バイトを受け取るまで閉じません。

ソケットでゼロバイトを取得することはできません。1 バイト以上、ストリームの終わり、またはエラー (Java では例外) を取得します。ここで、アプリケーション プロトコルに重大な問題があります。

上記のコードを再実行します。つまり、コピーして貼り付けて、もう 1 つの要求を順番に送信しようとすると、最初に開いたソケットを再利用できます。

それはHttpURLConnection接続プーリングを行っています。

于 2015-04-10T13:15:13.037 に答える