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

所属分类: 软件编程 / java 阅读数: 50
收藏 0 赞 0 分享

解决的方法有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);
更多精彩内容其他人还在看

java 中maven pom.xml文件教程详解

这篇文章主要介绍了java 中maven pom.xml文件教程详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

spring boot整合netty的实现方法

这篇文章主要介绍了spring boot整合netty的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Netty与Spring Boot的整合实现

这篇文章主要介绍了Netty与Spring Boot的整合的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring动态加载bean后调用实现方法解析

这篇文章主要介绍了Spring动态加载bean后调用实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现画图板上画一条直线

这篇文章主要为大家详细介绍了java实现画图板上画一条直线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java通过python命令执行DataX任务的实例

今天小编就为大家分享一篇Java通过python命令执行DataX任务的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享

springBoot集成redis的key,value序列化的相关问题

这篇文章主要介绍了springBoot集成redis的key,value序列化的相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java实现登录案例

这篇文章主要为大家详细介绍了java实现登录案例的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java解决请求跨域的两种方法

这篇文章主要为大家详细介绍了java解决请求跨域的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

SpringBoot集成Beetl后统一处理页面异常的方法

这篇文章主要介绍了SpringBoot集成Beetl后统一处理页面异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享
查看更多