2015-06-03 608 views
0

我製作了一個具有RETRLIST命令的FTP客戶端,但遇到了問題。我實現了RETR命令後我不斷收到此錯誤:向FTP服務器發出RETR命令時出現「501語法錯誤」

1:220-FileZilla Server version 0.9.50 beta 
1:220-written by Tim Kosse ([email protected]) 
1:220 Please visit https://filezilla-project.org/ 
2331 Password required for geek 
3230 Logged on 
5227 Entering Passive Mode (127,0,0,1,217,137) 
6200 Type set to A 
7150 Opening data channel for directory listing of "/" 
5227 Entering Passive Mode (127,0,0,1,217,139) 
150 Opening data channel for directory listing of "/" 
8501 Syntax error 
Exception in thread "main" java.net.ConnectException: Connection refused: connect 
at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
at java.net.PlainSocketImpl.connect(Unknown Source) 
at java.net.SocksSocketImpl.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.connect(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at java.net.Socket.<init>(Unknown Source) 
at ftp.ftp.connect(ftp.java:135) 
at ftp.test.main(test.java:12) 

而且我實現了RETR命令的客戶端停止給予LIST命令後;它不會告訴文件夾中有哪些文件。

public class ftp{ 
public synchronized void connect(String host, int port, String user, 
     String pass) throws IOException { 
    Socket socket = new Socket(host, port); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    BufferedWriter writer = new BufferedWriter(
      new OutputStreamWriter(socket.getOutputStream())); 


    String response = reader.readLine(); 

    if (!response.startsWith("220-")) { 
     throw new IOException(
       "FTP modtog et ukendt svar, da den blev forbundet til FTP server: " 
         + response); 
    } else {System.out.println("1:"+response); 
    response = reader.readLine(); 
    System.out.println("1:"+response); 
    response = reader.readLine(); 
    System.out.println("1:"+response); 


    } 
    writer.write("user geek"+"\r\n"); 
    writer.flush(); 
    response= reader.readLine(); 
    System.out.println("2"+response); 

    writer.write("PASS hello" +"\r\n"); 
    writer.flush(); 
    response= reader.readLine(); 
    System.out.println("3"+response); 



    writer.write("pasv"+"\r\n"); 
    writer.flush(); 
    response= reader.readLine(); 
    System.out.println("5"+response); 
    String [] r=response.trim().split(","); 

    String reg=r[4]; 
    String add= r[5].replace(")", ""); 
    int m = Integer.parseInt(reg); 
    int a = Integer.parseInt(add); 

    int port1 = m*256+a; 

    Socket datasocket = new Socket("127.0.0.1", port1); 
    writer.write("type A\r\n"); 
    writer.flush(); 
    response= reader.readLine(); 
    System.out.println("6"+response); 
    BufferedReader reader2 = new BufferedReader(new InputStreamReader(datasocket.getInputStream())); 


    writer.write("LIST\r\n"); 
    writer.flush(); 
    response = reader.readLine(); 
    System.out.println("7" + response); 

    List<String> files = new ArrayList<>(); 
    String text; 
    while ((text = reader2.readLine()) != null) { 
     String filename = parseFilename(text); 
     files.add(filename); 
    } 
    reader2.close(); 
    datasocket.close(); 
    reader.readLine(); 

    for (String file : files) { 
     int passivePort = getPort(reader, writer); 
     writer.write("RETR\r\n"); 
     writer.flush(); 
     System.out.println(response); 
     byte[] mybytearray = new byte[1024]; 

     try (Socket filesocket = new Socket("localhost", passivePort); 
       InputStream is = filesocket.getInputStream(); 
       FileOutputStream fos = new FileOutputStream("c:/Users/Username/Desktop/FTP/" + file)) { 
      int count; 
      while ((count = is.read(mybytearray)) >= 0) { 
       fos.write(mybytearray, 0, count); 
      } 
     } 
    } 

       writer.write("RETR\r\n"); 
      writer.flush(); 
      response= reader.readLine(); 
      System.out.println("8"+response); 

       Socket filsocket = new Socket ("localhost", port1); 
       InputStream is = null; 
       FileOutputStream fos = null; 

       byte[] mybytearray = new byte[1024]; 
      try { 
        is = filsocket.getInputStream(); 
        fos = new FileOutputStream("myfile.txt"); 

        int count; 
        while ((count = is.read(mybytearray)) >= 0) { 
         fos.write(mybytearray, 0, count); 
        } 
       } finally { 
       fos.close(); 
        is.close(); 
       filsocket.close(); 
      } 

} 

private String parseFilename(String text) { 

    return "abc.txt"; 
} 

private int getPort(BufferedReader reader, BufferedWriter writer) throws IOException { //this is line 135 
    String response; 
    writer.write("PASV" + "\r\n"); 
    writer.flush(); 
    response = reader.readLine(); 
    System.out.println("5" + response); 
    String[] r = response.trim().split(","); 

    String reg = r[4]; 
    String add = r[5].replace(")", ""); 
    int m = Integer.parseInt(reg); 
    int a = Integer.parseInt(add); 

    return m * 256 + a; 
} 


}  

感謝提前:)

+0

關於'LIST'的問題:服務器端日誌會有所幫助。 –

回答

0

RETR命令具有指定要下載的文件的名稱的強制性參數。服務器如何知道,你想下載哪個文件?

writer.write("RETR " + file + "\r\n"); 

RFC 959

RETR <SP> <pathname> <CRLF> 

無論如何,爲什麼你實現你自己的FTP協議?使用一些現有的實現,如FTPClient from Apache Commons

相關問題