InputStream is = socket.getInputStream(); is.read() 阻塞 这个怎么解决

章秋实 2017-03-14 11:55:50
在客户端解析服务端发回的报文,我们没有权利修改服务端的代码,请问,在客户端如何修改,在阻塞时终止程序进行下去,谢谢
...全文
930 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2021-04-07
  • 打赏
  • 举报
回复
引用 楼主 章秋实 的回复:
在客户端解析服务端发回的报文,我们没有权利修改服务端的代码,请问,在客户端如何修改,在阻塞时终止程序进行下去,谢谢
将 BIO 模式的程序,改成 NIO 模式的程序,就可以随时中断读写流程了。只要设置一个超时,然后,进行超时处理即可。 当然,编程复杂度会增加很多。要找高手帮忙哈。
qybao 2021-04-01
  • 打赏
  • 举报
回复
这种问题,你要换个方式处理 比如,用线程来执行is.read(),用个timer来记录,如果执行超时则杀死执行is.read()的线程
冰思雨 2021-04-01
  • 打赏
  • 举报
回复
Java 的 IO 通信,分为 BIO,NIO 和 AIO ,楼主的用法,是BIO,也就是说,读取/写入时,必须是阻塞的,除非抛出异常或者读/写操作完成。 emmm , 我换句话说吧: 1. is.read() 方法的阻塞过程是必然的,想不阻塞,就不能使用 is.read() 方法进行操作; 2. 既然阻塞是不能去掉的,那么,楼主遇到的问题应该是阻塞时间过于长了; 3. 阻塞时间过长,要么是对端没有数据发过来,要么就是数据发的慢,数据吞吐量太低。后者属于正常状况,不应该打扰这个过程。 对于 阻塞时间超长 的问题,我们一般通过设置超时来解决。 一般情况下,我们是不会强制干扰阻塞过程的,强制打扰阻塞过程,会造成不可预料的问题,要么业务数据出现问题,要么,程序崩溃。 IO超时这种手段,也不是解决问题的好办法,IO超时时,会抛出异常,自然程序就不能继续阻塞下去了。 怎样解决阻塞时间过长的问题? 1. 客户端和服务端之间的通信,需要定制专用协议,并针对长连接定制心跳包维持连接; 2. BIO 改成 NIO/AIO ,针对通信通道设置超时和超时响应机制,针对长时间无数据通信的场景下进行特殊处理。
程程Godlike 2021-03-29
  • 打赏
  • 举报
回复
请问问题解决了吗? 我也遇到了类似问题
章秋实 2017-03-14
  • 打赏
  • 举报
回复
引用 1 楼 bree06 的回复:
如果socket.getInputStream();在主线程被阻塞时, 是不可以被终止的, 如果是在子线程读取的话主线程可以调用stop()方法来终止子线程
你好,谢谢了,就是不终止的话,我能否通过其它途径监听到这个阻塞,然后进行其它操作,我以前试过读取超时,但是会影响程序进行,我这个是多次交互通信的,我这个是多线程的,但这个不是子线程
bree06 2017-03-14
  • 打赏
  • 举报
回复
如果socket.getInputStream();在主线程被阻塞时, 是不可以被终止的, 如果是在子线程读取的话主线程可以调用stop()方法来终止子线程

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧