您的位置:首页 > 编程语言 > Java开发

Java 中两种ftp操作方式

2010-01-22 12:36 513 查看
最近看到几篇关于java中操作ftp的文章,所以想写一个总结贴,标记一下,方便以后应用。



首先,我们可以应用java中的ftp库,java中提供了一个ftpclient的类,提供了很多操作ftp的方法。



先上代码,一看便知,很简单,应用时只要传递相应的server,user,password等就行了。



import java.io.IOException;
import sun.net.*;
import sun.net.ftp.*;
public class FTP {
   
    public static void main(String[] args) {
     
        String ftpserver="server url"; 
        String user="user"; 
        String pwd="pwd"; 
        String path="path";
       
        try {
         
          FtpClient ftpClient=new FtpClient();
          ftpClient.openServer(ftpserver);
          
          echo(ftpClient.getResponseString());
          
          ftpClient.login(user, pwd); 
          echo(ftpClient.getResponseString());
          
          if (path.length() != 0) {
        	  ftpClient.cd(path);
        	  echo(ftpClient.getResponseString());
          }
         
          TelnetInputStream tis = ftpClient.list();
          echo(ftpClient.getResponseString());
          int c;
          while ((c = tis.read())!= -1) {
             System.out.print((char)c);
          }
          echo(ftpClient.getResponseString());
          
          tis.close();
          echo(ftpClient.getResponseString());
          
          ftpClient.closeServer();
          echo(ftpClient.getResponseString());
        }
        catch(IOException ex){
        	ex.printStackTrace();
        }
     }
    
    static void echo(String response){
    	System.out.println("Response-----> " + response);     	
    }
}





在其内部都是发送socket请求的,只是帮我们封装好了。我们只要用相应的方法就行了。

在每个方面调用后面我都打印了从服务器返回的内容,这样可以方便我们ftp协议的理解。



读者可以拷贝到本地运行一下,看看ftp到底是如何运行的。



为了更清楚的理解ftp协议,下来使用原始的socket来操作ftp。



ftp服务器一般是在21端口监听的一个服务,我们只要向这个端口发送相应的请求就可以了。

请求我们必须参考ftp协议的规定,发送正确的格式。



下面这段代码是我收藏csdn上哪位博主的,基本上对ftp交互的这个过程中,协议的使用都写全了。



import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.Socket;  
public class FTPClient{
    public static void main(String[] args) throws Exception {  
    	
        Socket socket = new Socket("url",21);  
        
        //get the is and os, how to work about them.
        InputStream is = socket.getInputStream();  
        OutputStream os = socket.getOutputStream();
        
        //read info from the input stream, it is the response from server.
        byte[] buffer = new byte[10000];
        int length = is.read(buffer);
        String s = new String(buffer, 0, length);
        System.out.println(s);
        
        //send the user
        String str = "USER user/n";
        os.write(str.getBytes());
        //get the response.
        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);  
        
        //send the password.
        str = "PASS password/n";
        os.write(str.getBytes());
        //get the response.
        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);
        
        //send command.
        str = "CWD path/n";
        os.write(str.getBytes());
        //get the response.
        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);
        
        //set mode
        str = "EPSV ALL/n";
        os.write(str.getBytes());
        //get the response.
        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);
        
        //得到被动监听信息
        str = "EPSV/n";
        os.write(str.getBytes());
        //得到返回值
        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);
        
        //取得FTP被动监听的端口号
        System.out.println("debug----------------");
        String portlist=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
        System.out.println(portlist);
        
        //实例化ShowList线程类,链接FTP被动监听端口号
        ShowList sl=new ShowList();
        sl.port=Integer.parseInt(portlist);
        sl.start();
        //执行LIST命令
        str = "LIST/n";
        os.write(str.getBytes());
        //得到返回值        length = is.read(buffer);
        s = new String(buffer, 0, length);
        System.out.println(s);
        
        //关闭链接
        is.close();
        os.close();
        socket.close();
    }
}
// 得到被动链接信息类,这个类是多线程的
class ShowList extends Thread {
	public int port = 0;
	public void run() {
		try {
			Socket socket = new Socket("192.168.0.1", this.port);
			InputStream is = socket.getInputStream();
			OutputStream os = socket.getOutputStream();
			byte[] buffer = new byte[10000];
			int length = is.read(buffer);
			String s = new String(buffer, 0, length);
			System.out.println(s);
			// 关闭链接
			is.close();
			os.close();
			socket.close();
		} catch (Exception ex) {
		}
	}
}





如有兴趣的同学,可以好好看看ftp的协议过程,这样会更深理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: