2013-06-04 4 views
3

게임을 시작할 때 자동으로 최신 버전의 게임을 다운로드하는 "패처 런처"를 만들고 있습니다. 그러나 둘 이상의 사람이 동시에 파일을 다운로드하려고 시도하면 모두의 다운로드가 멈추고 중지되며 다른 모든 사람이 다운로드를 종료하고 한 번에 1 개만 다운로드하면 다시 시작됩니다. 누구든지 도울 수 있니? 다음은 URL에서 파일을 다운로드 할 때 사용하는 현재 코드입니다.여러 클라이언트가 다운로드하려고하면 URL에서 파일 다운로드가 중지됩니다.

public void saveUrl(String filename, String urlString) 
     throws MalformedURLException, IOException { 
    System.out.println("Downloading " + urlString); 
    BufferedInputStream in = null; 
    FileOutputStream fout = null; 

    int currentdlsize = 0; 
    int dlsize = new URL(urlString).openConnection().getContentLength(); 
    System.out.println("DL Size " + dlsize); 

    in = new BufferedInputStream(new URL(urlString).openStream()); 
    fout = new FileOutputStream(filename); 

    byte data[] = new byte[1024]; 
    int count; 
    while ((count = in.read(data, 0, 1024)) != -1) { 
     fout.write(data, 0, count); 
     currentdlsize += count; 
     System.out.println("Downloaded " + currentdlsize + "/" + dlsize); 
     prog.setMaximum(dlsize); 
     prog.setValue(currentdlsize); 
     progstat.setText("Downloading at " + currentdlsize + "/" + dlsize); 
    } 

    in.close(); 
    fout.close(); 

    System.out.println("Downloaded to " + filename); 
} 
+1

사용중인 서버 측은 무엇입니까? –

+0

예외가 발생하는 경우이를 알 수 있습니다. 예외를이 호출의 다음 상위 레벨로 던지기 때문에이 메소드에서 알 수 없으며 해당 코드가 예외를 처리하는 방법을 볼 수 없습니다. –

+0

서버쪽에는 별다른 차이가 없습니다. 아파치 파일 서버 일 겁니다. 나는이 분야에서 너무 지식이 없지만 기본적으로 게임 JAR을 내 웹 사이트에 업로드하고 거기에서 패치를 다운로드 받으십시오. 또한 예외가 발생하지 않으며, 다운로드는 모든 사용자에게 '일시 중지'됩니다. 다른 사용자가 응용 프로그램을 종료하고 사용자가 다운로드하는 유일한 사용자 일 때만 다시 시작됩니다. –

답변

2

귀하의 다운로드 코드를 확인보고 난 그렇게 당신의 다운로드 코드의 깊은 분석없이, 경쟁 조건에 대한 어떤 이유가 표시되지 않습니다,이 코드 (클라이언트 측)가 문제가되지 있음을 알 수 있습니다. 그것은 문제를 일으키는 서버 측, 즉 사이에있는 웹 서버 또는 프록시 또는 방화벽이어야합니다.

JNLP은 항상 응용 프로그램을 항상 최신 상태로 유지하고 시작시이를 확인하는 문제에 맞게 설계된 기술입니다.

+0

나는 어떻게 든이 문제를 다음과 같이 제거하여 해결했습니다. int dlsize = 새 URL (urlString) .openConnection(). getContentLength(); 그러나 지금은 다운로드의 파일 크기를 얻는 다른 방법에 대해 알지 못합니다. 그렇게 할 수있는 다른 방법은 없을까요? –

+0

이렇게하면 두 개의 연결을 열었습니다. 단일의'HttpURLConnection' 객체를 얻기 위해'URL.openConnection()'을 호출 한 다음 그 객체로부터 내용 길이와 입력 스트림을 가져와야합니다. – EJP

관련 문제