2013-04-10 263 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"); 

工作对我来说...