当前位置:  编程技术>java/j2ee

java socket长连接中解决read阻塞的3个办法

    来源: 互联网  发布时间:2014-11-07

    本文导语:  解决的方法有3个 : 1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length 2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效. 代码如下:Socket socket = new Socket(host,port); socket.setSoTimeout(100); // 如...

解决的方法有3个 :

1 约定发送的数据长度,比如 http的 keepAlive 就是必须依赖这个的 Content-Length
2 设置超时的时间,根据我的经验,只有在Socket级别设置才有效.

代码如下:
Socket socket = new Socket(host,port);
socket.setSoTimeout(100); // 如果超过100毫秒还没有数据,则抛出 SocketTimeoutException

3 让发送端发送完数据后,关闭连接。 这个在Http的操作时很常见。

(InputStream如何判断数据已经读取结束)

某些时候无法修改客户端的情况下情况一就只有pass掉了,情况二相对来说比较适合,当阻塞后直接抛出一个异常。情况三不适合长连接,因为整个通信过程中链路是不能中断的,也不能调shutdown结束。其实还有第四种方法:当读取到某些字符就不在往下读取了,比如读取到byebye就break。但是这也需要改客户端代码。选了一种折中的办法-设置超时:

StringBuilder sb = new StringBuilder();
try {
  client.setSoTimeout(500);
  while ((a = client.getInputStream().read(buf)) != -1) {
    sb.append(new String(buf, 0, a));
    if (a != size) {
      break;
    }
  }
} catch (Exception e) {
}
System.out.println(sb);

    
 
 

您可能感兴趣的文章:

  • 非阻塞式服务器 Web.Java
  • Java锁之阻塞锁介绍和代码实例
  • lunix下,用java在代码中启动另外一个进程遇到的问题,新启动的进程被阻塞.
  • Java 进程执行外部程序造成阻塞的一种原因
  • Java基于Runtime调用外部程序出现阻塞的解决方法
  • java执行bat命令碰到的阻塞问题的解决方法
  • 支持生产阻塞的Java线程池
  • java线程阻塞中断与LockSupport使用介绍
  • java数据库连接池和数据库连接示例
  • Java连接池 Nanopool
  • Java连接池 Proxool
  • Java连接池 DBCP
  • 如何用java连接mysql数据库?
  • Java数据库连接池 BoneCP
  • 怎样用java调用DLL动态连接库?
  • Linux系统下利用java连接Oracle 10G
  • 请教:java中如何调用linux下的静态连接库.a文件?
  • java如何连接数据库?
  • 请教:java中如何调用linux下的静态连接库.a文件?
  • java连接DB2问题
  • java连接SQL SERVER
  • Java 连接池组件 JConnectionPool
  • oracle和Java的连接,急!!
  • 用java开发数据库,连接db2应该如何设置classpath (或者说应引入哪个包)
  • 在java中怎么连接MSSQL这样的数据库?database的属性里用什么驱动?
  • Java 和 Access数据库连接问题。谢谢!!
  • 请问JAVA怎么连接Sybase ASA 6.0 ?
  • 请问启动的多个java虚拟机如何共享一个连接池?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁有办法用java执行于java.exe不在一个目录的class文件?
  • java中文件删除后,有没有办法恢复?????
  • 在VAJ中有办法改变核心的JAVA包吗?
  • 有什么办法自己用java编写一个数据库读写的文件呀?
  • 编译JAVA程序的时候,如果需要的JAR不在CLASSPATH,有什么办法能成功编译吗???
  • 各位有没有java的教学材料!没办法,要给别人上java课,以前根本就没讲过!
  • 运行Java程序时,我想把 dos窗口中的错误信息重定向到一个文本文件,请问有什么办法?
  • java里有没有办法得到一个表里的字段名
  • JAVA中没有宏,那编程和调试起来不是很麻烦吗?有没有一些折中办法?
  • java URL乱码的解决办法
  • :除使用vj6之外,我可用什麽办法把java编译成exe,快帮帮小妹!!
  • Java在Linux下 不能处理图形的解决办法 分享
  • java 代码中预防空指针异常的处理办法
  • Java客户端界面的国际化支持,有什么好的解决办法?跟帖有分,不够再加
  • ###java调用COM组件或COM调用java组件(EJB)解决办法。###
  • java在linux系统下开机启动无法使用sudo命令的原因及解决办法
  • 有没有办法让一个Java程序只能有一个实例在运行
  • Java下载文件时文件名乱码问题解决办法
  • java页面中文乱码的解决办法
  • 真的有点灰心了,学java两个月才,最近在用jb6+weblogic6.1学习servlet,可使无论如何都无法运行,就连一个小小的.java格式的servlet程序我都没办法编译成.class文件,真的对java有点灰心了.....
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3