从socket中读取数据时使用超时

ZDNet软件频道 时间:2003-04-25 作者:翻译:Java研究组织-郭晓刚 |  我要评论()
本文关键词:javatips
Java 1.4在Java API加入了非阻塞I/O(non-blocking I/O),不过Java 1.3和更早的版本都不支持这样的特性。然而,你可以用java.net.Socket类的超时属性来获得一些类似于非阻塞I/O的功能。
本文译自Builder.com,未经许可请勿转载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中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134