我正在编写一个简单的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用于复制,但只需1ms即可获得响应代码和内容长度。似乎在HttpURLConnection huc
的任何操作之前需要超过2分钟,之后一切都很好。有什么想法吗?
提前谢谢你们。
---------------------------------------------更新2 --------------------------------------------- 当我来到我的办公室时,问题就消失了。我还是不知道是什么造成的。我想这将与网络连接有关,因为服务器位于我办公室的一楼。如果我得到它们,我会发布更多更新。
答案 0 :(得分:0)
尝试致电
InputStream in = huc.getInputStream();
而不是
InputStream in = (InputStream) huc.getContent();
关于getContentLength()
和getResponseCode()
,显然他们会在返回之前下载整个文件。
<强> UPD 强>
评论显示连接服务器时出现问题。 试着打电话
in.close();
前
huc.disconnect();
重新启动Tomcat或在下次尝试之前等待一段时间。