繁体   English   中英

如何等待HttpURLConnection完成?

[英]How to wait till HttpURLConnection completes?

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

wget --quiet --post-file data.txt --output-document - --header "Content-Type: text/csv" http://localhost:8080/ingest

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

                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();

所以我的猜测是,实际上这段代码不是在等待数据提交,而是在后台执行此操作。 如何强制它阻塞直到实际数据传输完成?

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

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

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

因此,大约20秒钟之内没有阻塞的最可能原因是因为请求失败...,并且由于服务器或客户端实施问题而未正确报告该请求。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM