bufferedReader.readLine()读到最后发生阻塞问题

Socket通信中bufferedInputStream.read()读到数据流最后发生阻塞问题


最近在做一个imageserver,需求简化后就是使用socket响应HTTP请求从而截取所需要的数据流,写入到服务器端的文件中,从而完成客户端将图片上传到服务器。

因为从客户端得到的数据流中,我们只希望截取其中的一部分。这样就使我们无法像经常那样边读边向文件中写入,而且在流已经读到末尾时,使用bufferedInputStream.read()>0inputStream.read()>0作为while语句结束的判断条件在使用socket获得的数据流中是无法返回-1(因为客户端是通过浏览器提交的form表单,它无法告诉服务器的socket数据已经发送结束。因此read()方法还在等待客户端发送消息产生了阻塞)。

但是我们如果不使用bufferedInputStream.read(),我们就无法得到客户端的数据流。那么我们将如何取得数据流,并避免在读取数据时发生阻塞。

我是这样解决的:

 int newread = 0;
 int totalread = 0;
 int contentLength = Integer.parseInt(headers.get("content-length"));

 byte[] bytes = new byte[contentLength];

 while (totalread < contentLength) {
        newread = bufferedInputStream.read(bytes, totalread, contentLength - totalread);
        totalread += newread;
 }

headers:自定义的map对象用来存储之前已经解析的http请求消息中Content-Length的值

这样循环读数据可以解决两个问题:

  1. 避免使用read()方法造成的整个程序陷入阻塞。
  2. 当读的数据流较大时,还可以防止read()方法不能完全读取。

这样问题即可解决,完美!

2017/10/11 18:35:06

你可能感兴趣的:(Java学习笔记)