`
isiqi
  • 浏览: 16043736 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多
导读:
  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中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。
  
  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中读取数据时,你的程序不得不阻塞起来,但并不意味着你的程序这时什么也不能做。

本文转自
http://www.cn-java.com/www1/?action-viewnews-itemid-2506
分享到:
评论

相关推荐

    Linux下Socket连接超时的一种实现方法

    本文详细介绍了目前各平台通用的设置套接字(Socket)连接超时的办法,介绍了Linux环境下的Socket连接超时的一种实现方法。

    C#以流方式读socket超时设置的实例

    本文实例为大家分享了C#以流方式读socket超时设置的具体代码,供大家参考,具体内容如下 using System; using System.IO; using System.Net; using System.Text; using System.Net.Sockets; public class client { ...

    linux 下socket通信中select的用法实例

    fd_set *readfds是指向fd_set结构的指针,这个集合中应该包括文件描述符,我们是要监视这些文件描述符的读变化的,即我们关心是否可以从这些文件中读取数据了,如果这个集合中有一个文件可读,select就会返回一个...

    SSPI 打造纯API+汇编 winhttp及socket支持SSL安全连接

    但是hpsocket也有各种不安逸的地方,httpsync组件读文件在网速很慢的时候要设置超大的超时时间才能全部读取完,不能读写回调,所以就萌生了一个自己打造的念头。前辈:然而自己论坛也有开源的基于OpenSSL+Socket的...

    python socket 超时设置 errno 10054

    前几天使用python读取网页。因为对一个网站大量的使用urlopen操作,所以会被那个网站认定为攻击行为。有时就不再允许下载。导致urlopen()后,request.read()一直卡死在那里。最后会抛出errno 10054. 这个错误是...

    jnaCan:Java 的 CAN 总线,使用 JNA 访问 Linux SocketCan API

    但是,有套接字选项设置 SO_RCVTIMEO 值,以便读取超时。 包括 Netty 4.0 通道实现。 jnaCan 在 GNU LESSER GENERAL PUBLIC LICENSE Version 3 下获得许可,请参阅 LICENSE.txt jnaerator 开关 请注意,Linux C ...

    易语言-SSPI 打造纯API+汇编 winhttp及socket支持SSL安全连接

    但是hpsocket也有各种不安逸的地方,httpsync组件读文件在网速很慢的时候要设置超大的超时时间才能全部读取完,不能读写回调,所以就萌生了一个自己打造的念头。 前辈:然而自己论坛也有开源的基于OpenSSL+Socket的...

    Rock Proxy

    3、可设置连接超时和读取超时。 4、可设置代理类型:Rock proxy 1.0可以将其代理类型设为普通匿名代理或是高度匿名代理(对方完全不知道你使用了代理)。 5、完善的数据包监视功能:实时监视通过Proxy的数据包,以每...

    通讯调试工具,支持:串口通讯、串口代理、TCP、UDP、Telnet、Ping、TFtp等通讯测试

    6、支持数据触发模式,当串口(Socket)接收到预定义格式的数据时,可以直接触发脚本内指定的函数事件; 7、支持串口回环模式,发出的数据自动返回,便于脚本调试; 8、支持常用工具嵌入到本界面内部,由脚本定制...

    CocoaAsyncSocket-7.1

    虽然可以在主线程或者工作线程中使用它,但你不需要这样做。它异步的调用委托方法,使用NSRunLoop。委托方法包括 socket的参数,可让你在多个实例中区分 自包含在一个类中。你无需操作流或者socket,这个类帮你做了...

    cocoaasyncsocket

    虽然可以在主线程或者工作线程中使用它,但你不需要这样做。它异步的调用委托方法,使用NSRunLoop。委托方法包括 socket的参数,可让你在多个实例中区分 自包含在一个类中。你无需操作流或者socket,这个类帮你做了...

    CocoaAsyncSocket

    虽然可以在主线程或者工作线程中使用它,但你不需要这样做。它异步的调用委托方法,使用NSRunLoop。委托方法包括 socket的参数,可让你在多个实例中区分 自包含在一个类中。你无需操作流或者socket,这个类帮你做了...

    UDP_TCP_Socket_Programming:CS 3251编程分配1. Java中的UDP和TCP套接字

    Java中的#UDP和TCP套接字。 跑步说明 有两个文件夹:UDP_Implementation和TCP_Implementation。 您可以在各自的文件夹中找到每种实现的Java文件。 几乎所有内容都是在linux上创建和测试的,因此也请在linux上对其...

    X-Scan

    “从文件中获取主机列表” - 选中该复选框将从文件中读取待检测主机地址,文件格式应为纯文本,每一行可包含独立IP或域名,也可包含以“-”和“,”分隔的IP范围。 “报告文件” - 扫描结束后生成的报告...

    SpringBoot-Web-Mvc-Security:以Spring方式构建企业Java应用程序

    弹簧靴以Spring方式构建企业Java应用程序例防止暴力认证尝试连续3次失败的登录尝试后...表格上传并读取Excel文件 将Excel数据转换为表格并验证数据预保存图表忘记密码发送电子邮件重置密码使用Socket跟踪用户登录参考

    标准MFC WinSock ActiveX控件开发实例(II)高级篇

    最后一个参数,是网络发送或读取时的超时时间。 三、为Connect()接口添加源代码,看起来如下: //网络数据发送,在指定的超时时间内进行发送然后返回,成功返回实际发送字节数,否则返回负数 long CMFCWinSockCtrl::...

Global site tag (gtag.js) - Google Analytics