2013-06-04 55 views
1

這讓我變得有點瘋狂。如果無線連接被關斷的線無線連接禁用時,Socket.getOutputStream()阻塞

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

塊無限期我有以下Android設備上運行。

這是真棒!我可以建立一個超時,如果超過,我可以認爲有一些通信問題。

除了我找不到任何確認Socket.getOutputStream()應該阻止。
不在Oracle的javadoc中,也不在Google的Android javadoc中。

這是一個JVM依賴類的東西?我使用Android的dalvik jvm瀏覽了該行爲。

有沒有人遇到類似這樣的事情?

馬克

編輯評論作者:

我一直陪在好奇 「SSLSocket.getOutputStream()發起SSL握手如果neceessary」

什麼定義 「如果必要的話」?這種行爲(啓動SSL握手)是JVM規範所要求的嗎? IOW是否可以跨JVM保證?

我跑過這種行爲時,我關閉了我的無線連接,並試圖創建一個套接字與我的服務器通信。套接字的創建工作正常,我讀了關於爲什麼。我也讀過唯一確定套接字連接器是否工作的方法,就是用它讀取/寫入數據。這對我來說不是一種選擇,我想知道如果我可以依靠getOutputStream()在一分鐘內不返回,表示存在連接問題。

想法?註釋?

+0

我認爲它會在某個時刻拋出一個超時異常的形式? – njzk2

+0

njzk2 - 不,它不會拋出任何異常。這很容易處理。它只是掛在那裏。 – user1126515

+0

我的理解是,它應該拋出一個時間錯覺,可以在socket對象中進行配置。 – njzk2

回答

0

SSLSocket.getOutputStream()如果需要,會啓動SSL握手,其中涉及可能會阻塞的讀取操作。在調用它之前,您應該在套接字上設置讀取超時,其中包括Socket.setSoTimeout()

我被好奇 「SSLSocket.getOutputStream()發起SSL握手如果neceessary」

什麼定義 「如果必要的話」?

如果尚未完成,或當前SSL會話已失效。

這種行爲(啓動SSL握手)是JVM規範所要求的東西嗎? IOW是否可以跨JVM保證?

不,這是TLS/SSL specification所要求的。

我也讀過唯一的方法來確定一個套接字連接器將工作是讀取/寫入數據。這不適合我。

是的。你在做。 SSL握手包含讀取和寫入。

我想知道是否可以依賴getOutputStream()不會在一分鐘內返回以表示存在連接問題。

你可以依靠SocketTimeoutException握手爲表明連接不工作時被拋出,只要你設置一個合理的超時與Socket.setSoTimeout()正如我在答覆中提到。一分鐘是合理的。

+0

我對此有一些疑問,但他們太長以至於無法添加評論。我已將它們添加到原始帖子的末尾。你可以請看看並告訴我你的想法嗎? – user1126515

+0

@ user1126515請參閱編輯。 – EJP