2013-04-10 203 views
0

我被FTP客戶端java實現卡住了。 我只需要連接到FTP服務器並將一個文件傳輸到服務器。FTP客戶端java實現

我設法與ftp服務器建立連接(見下面的代碼),之後我用PASV命令進入被動模式。現在我不知道下一步該怎麼做。我嘗試在PASV命令後創建一個新的套接字,並將其連接到FTP服務器端口20,但這不起作用。

我的問題是如何建立連接時啓動文件傳輸? (我的想法是與端口20建立連接並執行STOR命令,但我不知道該怎麼做)。

你有什麼想法或有用的建議嗎?

btw。我要實現這一點沒有使用的Java類,如FTPClient

這裏是我的代碼:

public class FTPtest { 

    Socket socket; 
    PrintWriter pw; 
    BufferedReader input; 
    String info = ""; 

    public FTPtest(){ 
     try{ 
      socket = new Socket("some_ftp_server", 21); 
      logUsername(); 
      closeEverything(); 
     } 
     catch(IOException ioe){ 
      System.out.println("error"); 
     } 
    } 

    public void logUsername()throws IOException{ 
     input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     pw = new PrintWriter(socket.getOutputStream()); 

     //user 
     pw.write("USER some_user\n"); 
     pw.flush(); 
     System.out.println(input.readLine()); 

     //pass 
     pw.write("PASS some_pass"); 
     pw.flush(); 
     System.out.println(input.readLine()); 
     System.out.println(input.readLine()); 

     //PASV 
     pw.write("PASV"); 
     pw.flush(); 
    } 

    public void closeEverything() throws IOException{ 
     input.close(); 
     pw.close(); 
     socket.close(); 
    } 
    public static void main(String[]args){ 
     new FTPtest(); 
    } 
} 
+0

你想自己做一個FTP客戶端?因爲如果你只是在尋找一種連接到ftp服務器的方法,並且執行一些操作,你可以看看[Apache Commons-Net](http://commons.apache.org/proper/commons-net/)有一個集成的FTP客戶端類 – BackSlash 2013-04-10 15:38:35

+0

我想在不使用任何FTP客戶端類的情況下自己做FTP客戶端。 – Branko 2013-04-10 15:43:54

回答

1

你最好使用已經存在的FTP客戶端庫。 至於PASV請求 - 迴應它的服務器返回您應該連接到數據連接的編碼IP地址和端口。

+0

我想使用FTP客戶端庫,但我的任務是不使用任何。 – Branko 2013-04-10 15:48:09

+0

在這種情況下,您需要花一些時間閱讀RFC 959 – 2013-04-10 16:12:19

0

請仔細閱讀RFC 959的語法和響應細節,在Java中實現完整的FTP客戶端並不容易,而且需要相當長的時間。考慮使用JSCAPE的Secure FTP Factory來強大實現FTP/FTP協議。這裏是顯示示例代碼的documentation

0

我碰到同樣的問題。讀RFC 959,我注意到:

參數域由可變長度字符串 與字符序列(回車,換行) 爲NVT-ASCII表示結束的;對於其他協商的語言,可能會使用不同的行尾字符 。應注意的是 服務器將不採取任何行動,直到收到行代碼的末尾爲 。

而不是

pw.write("USER some_user\n"); 

嘗試

pw.write("USER some_user\r\n"); 

工作對我來說...