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中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。
闽公网安备 35060202000074号