1

これは私を少しナッツにしています。Androidデバイスで次を実行しています:

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) sc.getSocketFactory();

Socket s = (SSLSocket) sslsocketfactory.createSocket(someHost, somePort);

OutputStream o = s.getOutputStream();

ワイヤレス接続が回線からオフになっているかどうかを確認しました。

OutputStream o = s.getOutputStream();

無期限にブロックします。

これは素晴らしいです!!!! タイムアウトを確立できます。タイムアウトを超えた場合は、通信に問題があると想定できます。

Socket.getOutputStream() がブロックされるはずであるという確認が見つからないことを除いて。
Oracle の javadoc にも、Google の Android javadoc にもありません。

これはJVMに依存するものですか?Android の dalvik jvm を使用して動作に遭遇しました。

誰もこのようなことを経験しましたか?

マーク

コメントを追加するための編集:

「必要に応じてSSLSocket.getOutputStream()がSSLハンドシェイクを開始する」ことに興味があります

「必要に応じて」の定義は?この動作 (SSL ハンドシェイクの開始) は、JVM 仕様で必要なものですか? IOW は JVM 間で保証されていますか?

wifi接続をオフにして、サーバーと通信するためのソケットを作成しようとしたときに、この動作に遭遇しました。ソケットの作成は正常に機能し、その理由について読みました。また、ソケット接続が機能するかどうかを判断する唯一の方法は、それを使用してデータを読み書きすることです。これは私にとって選択肢ではなく、接続の問題があることを示すものとして、getOutputStream() が 1 分以内に返されないことに頼ることができるかどうか疑問に思っています。

考え?コメント?

4

1 に答える 1

1

SSLSocket.getOutputStream()必要に応じてSSLハンドシェイクを開始します。これには読み取りが含まれ、ブロックされる可能性があります。ソケットを呼び出す前に、ソケットに読み取りタイムアウトを設定する必要がありますSocket.setSoTimeout()

「必要に応じてSSLSocket.getOutputStream()がSSLハンドシェイクを開始する」ことに興味があります

「必要に応じて」の定義は?

まだ行われていない場合、または現在の SSL セッションが無効になっている場合。

この動作 (SSL ハンドシェイクの開始) は、JVM 仕様で要求されているものですか? IOW は JVM 間で保証されていますか?

いいえ、TLS/SSL 仕様で必要です。

また、ソケット接続が機能するかどうかを判断する唯一の方法は、それを使用してデータを読み書きすることです。これは私にとって選択肢ではありません。

はい、そうです。あなたはそれをやっています。SSL ハンドシェイクは、読み取りと書き込みで構成されます。

そして、接続の問題があることを示すものとして、 getOutputStream() が1分以内に返らないことに頼ることができるかどうか疑問に思っています。

私の回答で述べたようにSocketTimeoutException、適切なタイムアウトを設定すれば、接続が機能していないことを示すものとして、ハンドシェイク中にスローされることに頼ることができます。Socket.setSoTimeout()1分が妥当です。

于 2013-06-05T03:26:36.287 に答える