java 1.4在Java API加入了非阻塞I/O(non-blocking I/O),不過Java 1.3和更早的版本都不支持這樣的特性。然而,你可以用java.net.Socket類的超時屬性來獲得一些類似于非阻塞I/O的功能。
要使用超時屬性,首先你要創建一個socket,然后設置你期望的超時時間。setSoTimeout方法有一個參數,這個int型參數指定了socket在拋出一個違例前要等待的超時時間,單位是毫秒,像下面的例子:
Socket s = new Socket(server, port);
System.out.PRintln(s.getSoTimeout());
s.setSoTimeout(5000);
InputStream in = s.getInputStream();
現在我們嘗試從這個socket中讀數據。假如超過了指定的時間還讀不到任何數據,程序將拋出一個java.io.InterruptedIOException。你可以捕捉這一違例并決定是否嘗試進行另一次讀取操作:
try {
while ( (bytesRead = in.read(buffer)) != -1 ) {
// do something with the data
System.out.println
(new String(buffer, 0, bytesRead));
}
}
catch (InterruptedIOException e) {
System.err.print("timeout on read");
// 決定是否繼續讀取
}
在早于1.4的Java版本中,當從socket中讀取數據時,你的程序不得不阻塞起來,但并不意味著你的程序這時什么也不能做。
新聞熱點
疑難解答