首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何等待HttpURLConnection完成?

如何等待HttpURLConnection完成?
EN

Stack Overflow用户
提问于 2018-10-11 08:03:35
回答 1查看 2.8K关注 0票数 1

如果我将100K文件上传到我的服务的某个url,wget需要大约20秒才能完成:

代码语言:javascript
复制
wget --quiet --post-file data.txt --output-document - --header "Content-Type: text/csv" http://localhost:8080/ingest

但如果我在java中这样做,奇怪的是这会立即发生:

代码语言:javascript
复制
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setRequestMethod("POST");
                con.setRequestProperty("Content-Type", "text/csv;charset=UTF-8");
                con.setDoOutput(true);
                OutputStream outputStream = con.getOutputStream();
                outputStream.write(str.getBytes("UTF-8"));
                outputStream.flush();
                outputStream.close();
                System.out.println("code=" + con.getResponseCode());
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

所以我的猜测是,实际上这段代码并不是在等待数据提交,而是在后台完成这项工作。在实际数据传输完成之前,我如何强制它阻塞?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-11 08:15:50

该代码应该等待响应完成。con.getResponseCode()调用不会(不能!)返回,直到服务器至少使用包含响应代码的HTTP回复标头进行了响应。

可能是服务器在读取完客户端发布的数据之前发送了HTTP回复报头。那将是一个错误。(如果服务器发送响应太快,它将无法正确设置响应代码!)

也有可能服务器响应不是2xx响应,并且错误流而不是输入流上有服务器错误消息/诊断信息。(请阅读getInputStreamgetErrorStream上的javadoc。)

所以最有可能的原因是大约20秒内没有阻塞,因为请求失败了……由于服务器或客户端的实现问题,没有正确地报告这一点。

更新-事实证明,真正的问题是"curl“在某些平台上行为异常,可能是由于网络配置问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52750332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档