用java.net去post一个请求,但是返回的数据太大,如何完整接受?

但诺 2013-10-20 05:35:08
如题...用java.net.connection去post一个请求,但是返回的数据太大,如何完整接收?

用wireshark抓出来的是这种数据包...第一个便是post请求....接下来的都好像是返回数据...怎样完整接收啊?


我用的是getinputstream(),但是好像不完整的?怎么办?
...全文
364 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
但诺 2013-10-20
  • 打赏
  • 举报
回复
引用 5 楼 huxiweng 的回复:
给你一个我们项目中获取一个post请求的实例吧。你参考下:

/**
	 * a http request with given url
	 * 
	 * @param strUrl
	 *            the url you want to request
	 * @return
	 */
	public static String request(String strUrl) {
		strUrl = QuhaoConstant.HTTP_URL + strUrl;
		URL url = null;
		String result = "";
		HttpURLConnection urlConn = null;
		InputStreamReader in = null;
		try {
			url = new URL(strUrl);
			urlConn = (HttpURLConnection) url.openConnection();
			urlConn.setConnectTimeout(1000 * 20);
			in = new InputStreamReader(urlConn.getInputStream());
			BufferedReader br = new BufferedReader(in);

			String readerLine = null;
			while ((readerLine = br.readLine()) != null) {
				result += readerLine;
			}
			in.close();
			urlConn.disconnect();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			urlConn.disconnect();
		}
		return result;
	}
查了好久的资料,终于明白是什么问题了.
InputStream.available();
这个函数是非阻塞设计,在网络环境下,一旦遇到阻塞,返回值就会比实际流中的数据量小. 当返回数据较大,需要几个包来分开传送的时候,利用这个函数作为数组上限来获取数据,就会损失数据了...(我就是这样的做,所以数据少了很多很多.只要不用这个函数,用回传统的处理方法就好. 楼上你提供的代码可行...不过我的数据是经过加密的,所以字符流用起来也有很严重的损失.改用对应的字节流就好了.
失落夏天 2013-10-20
  • 打赏
  • 举报
回复
不知道楼主是什么原因,之前向服务器发送xlsx文件然后获取返回文件xls时,都是几M的文件。 我建议楼主还是换一种 接受inputstream的方式来试试吧
teemai 2013-10-20
  • 打赏
  • 举报
回复
给你一个我们项目中获取一个post请求的实例吧。你参考下:

/**
	 * a http request with given url
	 * 
	 * @param strUrl
	 *            the url you want to request
	 * @return
	 */
	public static String request(String strUrl) {
		strUrl = QuhaoConstant.HTTP_URL + strUrl;
		URL url = null;
		String result = "";
		HttpURLConnection urlConn = null;
		InputStreamReader in = null;
		try {
			url = new URL(strUrl);
			urlConn = (HttpURLConnection) url.openConnection();
			urlConn.setConnectTimeout(1000 * 20);
			in = new InputStreamReader(urlConn.getInputStream());
			BufferedReader br = new BufferedReader(in);

			String readerLine = null;
			while ((readerLine = br.readLine()) != null) {
				result += readerLine;
			}
			in.close();
			urlConn.disconnect();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			urlConn.disconnect();
		}
		return result;
	}
但诺 2013-10-20
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
确认下面的都是response吗?你是如何确认完整的是60K的?

我是抓包看的

我不懂怎么看response,但是一post到那个地址就一定有很多continuation的
这些包里的超文本协议都想这样的
teemai 2013-10-20
  • 打赏
  • 举报
回复
确认下面的都是response吗?你是如何确认完整的是60K的?
但诺 2013-10-20
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
是完整的,你把那个inputstream读到最后
读了啊,完整的是60K左右,可是读完只有10k 附我的读取代码
	InputStream is = con.getInputStream();
		//准备字节数组
			byte[] b = new byte[is.available()];
		//写入数组
			while(is.read(b) != -1);
			is.close();
teemai 2013-10-20
  • 打赏
  • 举报
回复
是完整的,你把那个inputstream读到最后

62,614

社区成员

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

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