2012-10-18 32 views
2

有沒有辦法讓SSLSocket等到握手完成而不使用addHandshakeListener()方法?我希望阻止它完成握手。更多的說明:最初使用常規(非SSL)套接字(這是必需的,因爲必須在實際握手發生之前將包發送到服務器)。使用SSlSocketFactory.createSocket將此套接字「轉換」爲SSLSocket。 我的問題是,是否有辦法現在同步做握手。直到握手完成時才阻止SSLSocket?

+0

也許這會幫助你:http://stackoverflow.com/questions/3246792/how-to-enable-logging-for-apache-commons-httpclient-on-android – pawelzieba

回答

4

SSLSocket.startHandshake()是一個同步調用,當你的同齡人之間開始握手是第一次,它會阻止調用線程,直到握手已經完成:

... ... 

// initial handshake between peers, don't need Listener: 
sslSocket.startHandshake(); // <- this will block the calling thread. 
// handshake is completed at this point 

... ... 

這不是在Android API完全記錄,請參閱原始Java API以獲得完整的javadoc:

在此連接上啓動SSL握手。常見原因包括需要使用新的加密密鑰,更改密碼套件或啓動新會話。要強制完成重新認證,在開始握手之前,當前會話可能失效。

如果數據已經在連接上發送,它將在此握手期間繼續流動。當握手完成時,這將通過事件發出信號。 此方法對於連接的初始握手是同步的,並在協商握手完成時返回。某些協議可能不支持現有套接字上的多個握手,並可能拋出IOException。

的情況,如果你操縱的同行之間的握手多次變得相當複雜,它可能是在某些情況下,異步調用(當你需要監聽器),看看這個在線文檔Fundamental Networking in Java瞭解更多詳情。

+0

@UkuLoskit,我從來沒有用過startHandshake( )在Android項目中的API,但是,根據javadoc,只要是第一次握手,startHandshake()就是同步參與的。請注意,Android開始自UI Level 11開始限制UI線程上的網絡操作,因此在您的Android應用中使用此網絡API時要小心,並確保您的代碼在不同的API級別上工作。 – yorkw

+0

@UkuLoskit,你甚至不需要使用'startHandshake()',只需從SSLSocket的I/O流開始讀/寫,就會啓動握手,並且在它成功完成之前不會發生。 – Bruno

+0

好吧,我的壞。我閱讀了文檔,但是我的應用程序運行的方式導致我錯誤地認爲它沒有被阻止。我會在兩個小時內獎賞你的獎金(由於限制,現在不能這樣做)。 –

相關問題