2012-12-13 215 views
0

我試圖在客戶端服務器之間傳輸文件,如果文件大於12MB,則通過塊發送,否則它會正常發送。我的主要問題是,每次我傳輸的東西都比原來的東西多得多,我需要在完成後使用摘要消息,這樣它不會按照它的方式工作,另一個是當我嘗試發送文件通過網絡客戶端讀取文件發送速度比服務器寫入更快,因此客戶端關閉程序關閉連接,破壞文件。我轉碼爲波紋管:通過套接字傳輸文件客戶端服務器java

這是客戶端傳輸代碼:

if(fSize>maxfileSize){ 
     totbLidos = 0; 
     byte[] fBytes = new byte[fBsize]; 
     while(totbLidos < fSize){ 
      int bRemain = (int) f.length() - totbLidos; 
      if(bRemain < fBsize){ 
       fBsize = bRemain; 
      } 
      int bRead = tFile.read(fBytes, 0, fBsize); 
      tServidor.write(fBytes, 0, fBsize); 
      tServidor.flush(); 
      if(bRead>0){ 
       totbLidos+=bRead; 
      } 

      System.out.println("Total Bytes Lidos: " + totbLidos); 

     } 

     tFile.close(); 
     System.out.println("Ficheiro enviado"); 
     cliente.close(); 
    } 
    else{ 
     totbLidos = 0; 
     byte[] fBytes = new byte[fSize]; 
     while(totbLidos < fSize){ 
      int bRead = tFile.read(fBytes,0,fSize); 
      if(bRead>0){ 
       totbLidos+=bRead; 
      } 
      tServidor.write(fBytes, 0, fSize); 
      System.out.println("Total Bytes Lidos: " + totbLidos); 
      tServidor.flush(); 
     } 
     tFile.close(); 
     System.out.println("Ficheiro enviado"); 
     cliente.close(); 
    } 
} 

服務器傳輸代碼:

if(fSize > maxfileSize){ 
      totbLidos = 0; 
      DataInputStream tFile = new DataInputStream(cliente.getInputStream()); 
      BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName)); 
      byte[] fBytes = new byte[fBsize]; 
      while(totbLidos < fSize){ 
       int bRemain = size - totbLidos; 
       if(bRemain < fBsize){ 
        fBsize = bRemain; 
       } 
       int bRead = tFile.read(fBytes, 0, fBsize); 
       fos.write(fBytes); 
       fos.flush(); 
       if(bRead>0){ 
        totbLidos+=bRead; 
       } 
       System.out.println("Bytes lidos: " + bRead); 
       System.out.println("Total Bytes Escritos: " + totbLidos); 
      } 
      System.out.println("Ficheiro recebido"); 

      fos.close(); 
      tFile.close(); 
      cliente.close(); 
      servidor.close(); 
     } 
     else if(fSize < maxfileSize){ 
      totbLidos = 0; 
      DataInputStream tFile = new DataInputStream(cliente.getInputStream()); 
      BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(fName)); 
      byte[] fBytes = new byte[fSize]; 
      while(totbLidos < fSize){ 
       int bRead = tFile.read(fBytes,0,fSize); 
       fos.write(fBytes); 
       fos.flush(); 
       if(bRead>0){ 
        totbLidos+=bRead; 
       } 
       System.out.println("Total Bytes Escritos: " + totbLidos); 
      } 
      System.out.println("Ficheiro recebido"); 
      fos.close(); 
      tFile.close(); 
      cliente.close(); 
      servidor.close(); 
     } 
} 

回答

2

你是不是寫相同的字節數,你在這裏找到。

fos.write(fBytes); 

嘗試使用

fos.write(fBytes, 0, bRead); 
+0

感謝該解決字節問題 –

0

除了@Peter Lawrey答案,我建議你可以重用Apache下議院IO API來避免這種錯誤的未來:

IOUtils.copyLarge(InputStream input, OutputStream output, long inputOffset, long length) 
相關問題