2013-02-03 46 views
2

所以我有一個學校的作業,其中客戶端必須發送無限制的文件到服務器。我這樣做了我的想法。發送無限的文件從客戶端到服務器

  1. 客戶端將無限制的文件發送到服務器。
  2. 服務器將通過客戶端上傳的文件重定向到我的WAMP的服務器文件夾

我已經工作的代碼,但是這個代碼只能從客戶端發送1個文件服務器。我還希望上傳文件的文件名增加,因爲在我的代碼中它只使用1個文件名,所以如果更多客戶端上傳文件,它們將覆蓋舊文件名。

例如:file01.rar接下來上傳file02.rar等等。

這裏是我的服務器代碼:

public void run() { 
    filePath = "C:/wamp/www/file.rar"; 
    byte[] aByte = new byte[1]; 
    int bytesRead; 
    InputStream is = null; 
    try { 
     is = clientSocket.getInputStream(); 
    } catch (IOException ie) { 
     ie.printStackTrace(); 
    } 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    if (is != null) { 
     FileOutputStream fos = null; 
     BufferedOutputStream bos = null; 
     try { 
      fos = new FileOutputStream(filePath); 
      bos = new BufferedOutputStream(fos); 
      bytesRead = is.read(aByte, 0, aByte.length); 
      do { 
       baos.write(aByte); 
       bytesRead = is.read(aByte); 
      } while (bytesRead != -1); 
      bos.write(baos.toByteArray()); 
      bos.flush(); 
      bos.close(); 
     } catch (IOException ie) { 
      ie.printStackTrace(); 
     } 
    } 
} 

這裏是我的客戶端代碼:

BufferedOutputStream bos = null; 
      try { 
       bos = new BufferedOutputStream(s.getOutputStream()); 
      } catch (IOException ie) { 
       ie.printStackTrace(); 
      } 

      if (bos != null) { 
       File uploadFile = new File(clientFacultyUploadTextField.getText()); 
       byte[] myFileSize = new byte[(int)uploadFile.length()]; 
       FileInputStream fis = null; 
       try { 
        fis = new FileInputStream(uploadFile); 
       } catch (FileNotFoundException fife) { 
        fife.printStackTrace(); 
       } 
       BufferedInputStream bis = new BufferedInputStream(fis); 
       try { 
        bis.read(myFileSize, 0, myFileSize.length); 
        bos.write(myFileSize, 0, myFileSize.length); 
        bos.flush(); 
        bos.close(); 
        clientFacultyUploadTextField.setText("Upload complete..."); 
       } catch (IOException ie) { 
        ie.printStackTrace(); 
       } 
      } 
+0

關於SO的第一個問題和這麼好的格式化,+1 :) – Abubakkar

回答

0

當您發送多個文件,你需要告訴服務器當一個文件停止和其他文件開始,以便它可以分開處理它們。

有多種方法可以解決這個問題。這裏有一些,從簡單但限制到硬但令人印象深刻:

a)爲每個文件使用一個新的連接,並在傳輸完成時關閉它。這告訴服務器文件結束。這樣做的好處是您可以輕鬆擴展它以允許同時上傳多個文件。缺點:當傳輸由於某種原因而中斷時,服務器可能無法將其檢測爲錯誤,並將部分文件保存爲完整文件。

b)使用相同的連接,但告訴服務器每個文件的長度。您可以通過以文件長度以字節爲單位開始每個文件傳輸來完成此操作。這樣服務器可以讀取這個字節數,然後開始一個新文件。當然,這隻在事先知道文件大小時才起作用。在流式傳輸上傳文件時,不能使用它。

c)使用成幀協議。將文件分成塊,並在每個塊的前面加上一個標題,告訴服務器塊的長度,以及它是否是最後一塊,或者是否有更多的塊會跟隨。這種方法有一些開銷,但它是一個非常可擴展的體系結構,它允許您通過向標題添加更多信息來輕鬆添加新功能。例如,您可以允許通過將一個連接的傳輸ID添加到標題來複用多個傳輸,通過添加序列號和控制代碼來中止和恢復上傳,指示服務器刪除或重命名的特殊命令幀它已有的文件等等。想了解一些靈感,看看HTTP和FTP的工作方式。

+0

Im lost,where I should start?我想你的第二個解決方案對我來說是最好的也是最簡單的。告訴我,如果我做的是正確的事情。我會得到文件的長度?然後使用條件語句,如if(file == fileSize)?然後使用像布爾完成並將其設置爲true?像那樣? –

相關問題