我正在编写一个简单的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秒...
运气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,在in.close()
之前添加huc.disconnect()
,发生了同样的事情:119s在huc.getInputStream()
之前冻结,15s用于复制,但是仅1毫秒即可获得响应代码和内容长度。似乎需要2分钟以上的时间才能对HttpURLConnection huc
进行任何操作,然后一切都很好。有任何想法吗?预先谢谢你们。
---------------------------------------------更新2 --- ------------------------------------------
当我来到办公室时,问题就消失了。我仍然不知道是什么原因造成的。我想这可能与网络连接有关,因为服务器位于我办公室的二楼。如果有更新,我会发布更多更新。
最佳答案
尝试致电
InputStream in = huc.getInputStream();
代替
InputStream in = (InputStream) huc.getContent();
关于
getContentLength()
和getResponseCode()
,显然他们先下载整个文件,然后再返回。UPD
注释显示连接到服务器存在问题。
尝试致电
in.close();
之前
huc.disconnect();
并重新启动Tomcat或等待一段时间,然后再尝试。