2013-06-04 32 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

在服務器端沒有什麼特別的,我猜它只是一個普通的Apache文件服務器。我對這方面的知識不太瞭解,但基本上我只是將遊戲JAR上傳到我的網站,然後從那裏下載修補程序。也沒有例外拋出,下載只是爲每個人「暫停」,只有當其他人退出應用程序時纔會恢復,並且您是唯一下載的人。 –

回答

2

你的下載代碼看起來不錯,我看不出有任何理由的競爭條件,所以沒有你的下載代碼更深入的分析,我可以告訴你,這個代碼(客戶端)是沒有問題的。它必須是導致問題的服務器端,即您的網絡服務器或中間的代理或防火牆。

此外,也許你應該看看JNLP,這是一個專門爲您的應用程序始終更新並在啓動時檢查此問題而設計的技術。

+0

我不知何故設法通過刪除來解決該問題: int dlsize = new URL(urlString).openConnection()。getContentLength(); 但是,現在我不知道有任何其他方式來獲得下載的文件大小,任何其他方式我可以這樣做嗎? –

+0

您正在通過這樣做打開兩個連接。你應該調用'URL.openConnection()'獲得一個'HttpURLConnection'對象,然後從該對象獲取內容長度和輸入流。 – EJP