轉:http://www.xd-tech.com.cn/blog/article.asp?id=37
Java中可以使用HttpURLConnection來請求WEB資源。
HttpURLConnection對象不能直接構造,需要通過URL.openConnection()來獲得HttpURLConnection對象,示例代碼如下:
String urlStr= www.jaddy.org;
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
HttpURLConnection是基於HTTP協議的,其底層通過socket通信實現。如果不設置超時(timeout),在網絡異常的情況下,可能會導致程序僵死而不繼續往下執行。可以通過以下兩個語句來設置相應的超時:
System.setProperty("sun.net.client.defaultConnectTimeout", 超時毫秒數字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超時毫秒數字符串);
其中: sun.net.client.defaultConnectTimeout:連接主機的超時時間(單位:毫秒)
sun.net.client.defaultReadTimeout:從主機讀取數據的超時時間(單位:毫秒)
例如:
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTimeout", "30000");
JDK 1.5以前的版本,只能通過設置這兩個系統屬性來控制網絡超時。在1.5中,還可以使用HttpURLConnection的父類URLConnection的以下兩個方法:
setConnectTimeout:設置連接主機超時(單位:毫秒)
setReadTimeout:設置從主機讀取數據超時(單位:毫秒)
例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
備注:
我在項目中碰到這個問題比較隱蔽,開始我以為是線程死鎖造成我的線程無法執行下去,后來我用 Java visualVM工具顯示的線程DUMP堆信息:
"Tue Jun 17 09:41:40 CST 2014172.16.11.107" daemon prio=6 tid=0x0db77c00 nid=0x1470 runnable [0x0f43f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
- locked <0x06735a50> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1064)
- locked <0x06735a88> (a sun.net.www.protocol.http.HttpURLConnection)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderFields(HttpURLConnection.java:2187)
at com.zzst.application.meeting.mcu.operate.rmx2000.RMX2000Sender.sendPost(RMX2000Sender.java:86)
at com.zzst.application.meeting.mcu.operate.rmx2000.RMX2000Sender.sendPost(RMX2000Sender.java:35)
at com.zzst.application.meeting.mcu.operate.rmx2000.ZZMCU2000ContactHandler.contact(ZZMCU2000ContactHandler.java:124)
at com.zzst.application.meeting.mcu.operate.rmx2000.ZZMCU2000ContactHandler.run(ZZMCU2000ContactHandler.java:65)
at java.lang.Thread.run(Thread.java:619)
Locked ownable synchronizers:
- None
從這個堆信息可以看出,停在“HttpURLConnection.getHeaderFields”語句處。現在我在我的程序里設置了連接主機超時和從主句中獲取數據超時兩個參數,看看接下來系統運行效果如何。