调用getResponseCode,getContentLength时,HttpURLConnection会冻结

时间:2014-02-14 05:44:41

标签: java tomcat servlets httpurlconnection

我正在编写一个简单的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 --------------------------------------------- 当我来到我的办公室时,问题就消失了。我还是不知道是什么造成的。我想这将与网络连接有关,因为服务器位于我办公室的一楼。如果我得到它们,我会发布更多更新。

1 个答案:

答案 0 :(得分:0)

尝试致电

InputStream in = huc.getInputStream();

而不是

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

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

<强> UPD

评论显示连接服务器时出现问题。 试着打电话

 in.close();

 huc.disconnect();

重新启动Tomcat或在下次尝试之前等待一段时间。