2009-10-15 65 views
2

我們正在連接到Web服務,如下所示:如何調試掛接連接?

URL url = new URL("https://..."); 
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty("Content-length", "" + data.length()); 
conn.setDoOutput(true); 
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream()); 

有時,連接掛在最後一行,無論是用一個很長的或無限超時。

我們怎麼能進入這個並找出發生了什麼,當然? (我們有很多猜測,但在這一點上沒有什麼確認。)我們用大量的日誌語句(這是我們如何知道停止點在哪裏)來檢測代碼,但是不能很好地對Java執行相同的操作庫。我們可以說服這些班級告訴我們什麼額外的信息?如果我們想設定超時時間,我們將如何做?

我們如何調試?

回答

4

如果您使用Sun的JSSE提供程序來支持SSL(這是在Sun運行時中使用「https:」URL時的默認行爲),您可以將javax.net.debug系統屬性設置爲查看SSL握手的進度。有關可使用的值

詳細信息可在the JSSE reference guide;打開所有 SSL調試,使用類似

java -Djavax.net.debug=all com.y.MyClass 

由於大部分的初始握手是加密的,像Wireshark的一個工具,可以很如果您熟悉SSL,也很有用。如果你有服務器私鑰,那麼Wireshark也應該能夠解密一個對話(只要你沒有使用臨時密碼套件),但我從來沒有能夠使它工作。

0

由於Keep-Alive連接,您可能會卡住。嘗試強制連接關閉...

URL url = new URL("https://..."); 
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
conn.setRequestMethod("POST"); 
conn.setRequestProperty("Connection", "close"); 
conn.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty("Content-length", "" + data.length()); 
conn.setDoOutput(true); 
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());