2013-03-26 117 views
0

我正在寫一個簡單的FTP客戶端/服務器設置。客戶端應該能夠從服務器檢索文件,並將結果作爲字節流放入/ retr_files/filex中。從服務器發送適當的響應,並確實在該文件夾中創建file1。但是,太多的字節被髮送(或接收)。我在一個9.6kB的文件上測試了這個文件,它在客戶端的文件是16.6kB。奇。我覺得我在這裏錯過了一些明顯的東西,有人可以幫我嗎? 謝謝!客戶端從服務器讀取太多字節?

相關代碼:

客戶:

BufferedReader inFromServer_d = null; 

    if(welcomeSocket!=null){ 
     if(!welcomeSocket.isClosed()){ 
      welcomeSocket.close(); 
     } 
    } 

    try { 
     welcomeSocket = new ServerSocket(port); 
     System.out.print("PORT " + myIP + "," + num1 + "," + num2 + "\r\n"); 
     out.writeBytes("PORT " + myIP + "," + num1 + "," + num2 + "\r\n"); 
     System.out.print(parseReply(getResponse())); 
     System.out.print("RETR " + pathname + "\r\n"); 
     out.writeBytes("RETR " + pathname + "\r\n"); 
     String reply = parseReply(getResponse()); 
     if (reply.charAt(10)=='1') { 
      System.out.print(reply); 
      System.out.print(parseReply(getResponse())); 

      try{ 
       clientSocket_d = welcomeSocket.accept(); 
      } catch (IOException e) { 
       System.out.print("GET failed, FTP-data port not allocated.\r\n"); 
       System.exit(-1); 
      } 


       inFromServer_d = new BufferedReader(new InputStreamReader(
         clientSocket_d.getInputStream())); 


      // READ 
      BufferedReader bufferedReader = inFromServer_d; 
      FileWriter output = new FileWriter("retr_files/file" + retrCnt); 
      BufferedWriter bufferedWriter = new BufferedWriter(output); 

      String length; 
      while ((length = bufferedReader.readLine()) != null) { 
       bufferedWriter.write(length + "\n"); 
      } 

      bufferedReader.close(); 
      bufferedWriter.close(); 
      clientSocket_d.close(); 

服務器:

//TCP CONNECT 
         DataOutputStream outToClient_d = null; 
         Socket clientSocket1 = null; 


         try { 
          ipAddress = ipAddress.substring(0, ipAddress.length()-1); 
         clientSocket1 = new Socket(ipAddress, portNumber); 
         outToClient_d = new DataOutputStream(clientSocket1.getOutputStream()); 
         } 

         catch(UnknownHostException e){ 
          out.writeBytes("425 Can not open data connection.\r\n"); 
         } 



         BufferedReader bufferedReader = new BufferedReader(input); 

         String length; 
         while((length = bufferedReader.readLine())!=null){ 
          outToClient_d.writeBytes(length+"\n"); 
         } 
         out.writeBytes("250 Requested file action completed.\r\n"); 
         bufferedReader.close(); 
         clientSocket1.close(); 
         outToClient_d.close(); 

}

回答

2

不要使用讀者和作家和readline()。所有文件都不是文本文件,並非所有文本文件都有換行符。使用流。

+0

哈哈,這很有道理。謝謝! – Haskell 2013-03-26 22:57:09

0

我想在你的客戶端,新創建的文件必須有額外的新行每條印刷線之間。這可能會導致文件大小的增加。 AT客戶端替換此行:

bufferedWriter.write(length + "\n"); 

bufferedWriter.write(length); 
+0

newLine被readLine()移除,但他不應該做任何這樣的事情。 – EJP 2013-03-26 21:56:10