2014-02-14 2 views
2

tomcat6이 설치된 서버에 연결하는 간단한 Java 프로그램을 작성하고 있습니다. 문제는 서버에서 .mp4 파일에 액세스 할 때 다음 코드를 사용하면 1.mp4에 액세스해도 문제가되지 않지만 다른 파일 (2.mp4,3.mp4 등)에 액세스하면 문제가되지 않습니다. getResponseCode() 및 getContentLength()를 수행하는 데 약 2 분이 소요됩니다. 약간의 시간.getResponseCode, getContentLength를 호출 할 때 HttpURLConnection이 멈추는 경우

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초입니다 ...보다 훨씬 더 다음과 같이 클라이언트에서의 코드는 우천 1백20초 ...

그리고 행운 1.mp4의 일반적인 출력은 다음과 같습니다

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

모든 FIL e는 25MB보다 작으며/usr/share/tomcat6/webapps/ROOT에 있습니다. 서버는 기본 서블릿을 사용합니다. 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을 다시 시작한 후 huc.disconnect() 앞에 in.close()을 추가하면 11933이 동결되기 전까지 huc.getInputStream(), 15 초가되지만 응답 코드와 내용 길이는 1ms 만 남았습니다. HttpURLConnection huc에 어떤 작업을하기 전에 2 분 이상이 필요하고 그 후에는 문제가없는 것으로 보입니다. 어떤 아이디어?

미리 감사드립니다.

--------------------------------------------- 업데이트 2 --------------------------------------------- 문제가 해결되었습니다. 내가 내 사무실에 왔을 때 멀리 갔다. 나는 아직도 그것을 일으킨 원인을 모른다. 서버가 내 사무실 1 층에 있기 때문에 네트워크 연결과 관련이있는 것 같아요. 내가 가지고 있다면 더 많은 업데이트를 게시 할 것입니다.

+0

나는 여기 같은 문제를 만났다고 생각한다. 정말로 네트워크에 관한 것인가? 내 코드가 단일 노드에서 실행되고 있기 때문에 묻고 있습니다 ... 이상합니다. –

답변

0

분명히 그들이 다시 돌아 오기 전에 전체 파일을 다운로드 getContentLength()getResponseCode()에 관한

InputStream in = huc.getInputStream(); 

대신

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

의 전화를보십시오.

UPD

댓글은 서버에 연결에 문제가 있음을 보여 주었다.

in.close(); 

전에
huc.disconnect(); 

전화와 Tomcat을 다시 시작하거나 다음 시도하기 전에 일정 시간을 기다려야보십시오.

+0

나는 다운로드 속도가 합리적이라고 생각한다. 10 MB는 10 초, 24 MB는 32 초이므로 InputStream과 아무런 관련이 없다. 그러나 getContentLength() 및 getResponseCode()가 전체 파일을 다운로드하더라도 거의 5 분 정도 소요됩니다. 게다가, 1.mp4는 0.107, 2.mp4는 279.565s 밖에 안되는 이유는 무엇입니까? 재현성이있어서 연결 품질 때문에라고 생각합니다. –

+0

무엇인가의 이유로 운이 좋은 1.mp4는'getContentLength()/getResponseCode()'에 다운로드되지 않습니다. 모바일 장치 용 저속'getContentLength()/getResponseCode() '와 비슷한 문제에 대해 웹에서 주제를 발견했습니다. 모바일에서 클라이언트를 실행하고 있습니까? 어쨌든 먼저 파일을 다운로드 한 다음 다른 방법을 호출하십시오. – Vitaly

+0

나는 내 노트북에서 달리고있다. 하지만 그 전에 나는 내 스마트 폰에서 똑같은 문제에 직면 해있다. 그래서 내 랩톱에서 테스트하려고한다. (하지만 같은 코드가 잘 작동하고 오늘 오후에 느린 문제가 발생한다.) 나는 당신이 말한 것을 시도했지만 불행한 파일은 여전히 ​​재수가있다. . 나는 huc.getInputStream()을 url.openConnection 바로 뒤에 놓았지만, huc.getInputStream()을 287 초 전에 멈추고, 15 초를 마친 후에도 복사가 끝난다. 그래서 getContentLength()와'getResponseCode()'가 반환 전에 모든 것을 다운로드했기 때문에 그것이 믿을 수 없다. –

관련 문제