java socket io

veryitman 2011-12-26 08:38:56
代码:

Socket client = 创建实例;
InputStream is = client.getInputStream();
DataInputStream dis = new DataInputStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while ((len = dis.read(buf, 0, 1024)) != -1) {
baos.write(buf, 0, len);
}

在实际当中,代码会在while ((len = dis.read(buf, 0, 1024)) != -1)处卡死,导致程序一直等待,请问大家这是什么原因,如何解决?
...全文
194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
iGoodLoser 2011-12-26
  • 打赏
  • 举报
回复
这个是因为读取不到服务器端的数据流而导致read方法一直堵塞,跟用不用nio没关系
估计是你的服务器端发送来的数据流在read执行之前!或者试试这样行么:

Socket client = 创建实例;
InputStream is = client.getInputStream();
DataInputStream dis = new DataInputStream(is);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = -1;
while(true){//循环监听服务器端发送来的数据流
while ((len = dis.read(buf, 0, 1024)) != -1) {
baos.write(buf, 0, len);
}
}
veryitman 2011-12-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 looking_glass 的回复:]

个人认为:不是卡死,是线程阻塞。java io的jni就这样实现,只要流无到末端,调用read方法无数据,就一直阻塞。也是我们想要的结果。如要你的继续程序运行,只要的在scocket的另一端写入数据,你的socket就不会阻塞。
[/Quote]

对,就是线程阻塞。

您可以说详细一点吗?如果使用java的nio可以解决这个问题吗?
Looking_Glass 2011-12-26
  • 打赏
  • 举报
回复
个人认为:不是卡死,是线程阻塞。java io的jni就这样实现,只要流无到末端,调用read方法无数据,就一直阻塞。也是我们想要的结果。如要你的继续程序运行,只要的在scocket的另一端写入数据,你的socket就不会阻塞。

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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