gpt4 book ai didi

java - 调用 getResponseCode、getContentLength 时 HttpURLConnection 卡住

转载 作者:行者123 更新时间:2023-11-28 22:02:56 25 4
gpt4 key购买 nike

我正在编写一个简单的 java 程序来连接到安装了 tomcat6 的服务器。问题是,当我使用以下代码访问服务器上的 .mp4 文件时,如果我访问 1.mp4 没问题,但是当我访问其他文件(2.mp4、3.mp4 等)时,它通常执行 getResponseCode() 和 getContentLength() 大约需要两分钟。有的时候更长。客户端代码如下:

public static void main(String[] args) throws IOException {
long time = System.currentTimeMillis();
String urlText = "http://some_http_address:some_port/1.mp4";

URL url = new URL(urlText);
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
System.out.println("opConnection " + (double)(System.currentTimeMillis()-time)/1000 + "s ");

int code = huc.getResponseCode();
System.out.println("Code: " + code + " " + (double)(System.currentTimeMillis()-time)/1000 + "s ");

int size = huc.getContentLength();
System.out.println("Size: " + size + " " + (double)(System.currentTimeMillis()-time)/1000 + "s ");

InputStream in = (InputStream) huc.getContent();
System.out.println("Start to copy " + (double)(System.currentTimeMillis()-time)/1000 + "s ");

FileOutputStream fos = new FileOutputStream("/some/path/temp/temp.mp4");//destinationfile

byte[] buffer = new byte[1024];
int len1 = 0;
if(in != null){
while ((len1 = in.read(buffer)) > 0) {
fos.write(buffer,0, len1);
}
}

if(fos != null){
fos.close();
}

huc.disconnect();
System.out.println("Copy done " + (double)(System.currentTimeMillis()-time)/1000 + "s " + System.currentTimeMillis());
}

不幸文件的典型输出是:

opConnection 0.007s 
Code: 200 279.565s
Size: 10246547 279.565s
Start to copy 279.57s
Copy done 297.258s 1392356076554

当我尝试收集数据时,大约是 279 秒...远远超过通常的 120 秒...

luck 1.mp4 的典型输出是:

opConnection 0.004s 
Code: 200 0.107s
Size: 24448266 0.107s
Start to copy 0.113s
Copy done 32.1s 1392355716952

所有文件都很小,小于 25 MB,位于/usr/share/tomcat6/webapps/ROOT。服务器使用默认的 servlet。 conf/web.xml 的一部分是:

<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

奇怪的是 getResponseCode 这么慢。在上面的例子中,getContentLength 只花费了很少的时间,但是如果我在它之前没有 getResponseCode 的情况下执行,它也需要很长时间才能获得大小。更奇怪的是,它只发生在 1.mp4 以外的文件上!它永远不会发生在 1.mp4 上。

我对此很困惑,有人知道吗?

--------------------------------------------更新1 --------------------------------------------

按照建议,复制完成后我移动了huc.getResponseCode()huc.getResponseCode(),在服务器重启tomcat,在中添加.close() before huc.disconnect(),同样的事情发生了:119s freeze before huc.getInputStream(), 15s for copy, but only 1ms获取响应代码和内容长度。似乎它需要超过 2 分钟才能对 HttpURLConnection huc 进行任何操作,之后一切正常。有什么想法吗?

提前谢谢你们。

--------------------------------------------更新2 ------------------------------------------当我回到我的办公室时,问题就消失了。我仍然不知道是什么原因造成的。我想这可能与网络连接有关,因为服务器在我办公室的一楼。如果我收到更新,我会发布更多更新。

最佳答案

尝试调用

InputStream in = huc.getInputStream();

代替

InputStream in = (InputStream) huc.getContent();

关于 getContentLength()getResponseCode(),显然他们在返回之前下载了整个文件。

UPD

评论显示连接到服务器时出现问题。尝试调用

 in.close();

之前

 huc.disconnect();

然后重新启动 Tomcat 或等待一段时间再尝试。

关于java - 调用 getResponseCode、getContentLength 时 HttpURLConnection 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21771702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com