⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpsearch.java

📁 列出FTP站点的文件及目录程序
💻 JAVA
字号:
package zhq.ftpsearch;

import java.io.*;
import java.net.*;
import java.util.*;

/**  本类可以搜索某个FTP站点的内容,要求给出站点IP地址。*/
public class FTPSearch extends Thread
{
/**主机ip地址*/
String _host;

/**端口号*/
static final int PORT=21;

ServerSocket ss;

Socket _ds;

Socket _sc;

PrintStream _out	;

String _hostAddress;

BufferedReader _in ;	 

BufferedReader _dataIn;

/**一个临时存放从服务器读取的信息的变量*/
String _reply;

/**存放搜索日志*/
protected StringBuffer _log=new StringBuffer(10000);

/**存放搜索结果*/
Vector _result;

String _user;
String _pass;

/**构造函数。<br>参数:ip为远端主机ip地址,user为用户名,pass为口令。*/
public FTPSearch (String ip,String user,String pass)
	{
		_host=ip;
		_user=user;
		_pass=pass;
		_result=new Vector();
	}

/**构造函数。<br>参数:ip为远端主机ip地址,匿名登录。*/
public FTPSearch (String ip)
	{
		_host=ip;
		_user="anonymous";
		_pass="wildfield@126.com";
		_result=new Vector();
	}

/**连接登录<br>Return:<br>true:登录成功;false:denglu登录失败.*/
protected boolean login()throws UnknownHostException,IOException
	{ 
	  boolean successful=false;
		StringBuffer reply=new StringBuffer();
		_sc=new Socket(_host,PORT);
		_hostAddress=_sc.getLocalAddress().getHostAddress().replace('.',',');
		_sc.setSoTimeout(15000);
		_out = new PrintStream(_sc.getOutputStream(),true); 
	  _in  = new BufferedReader(new  InputStreamReader(_sc.getInputStream())); 
		reply.append(readReply().trim());
		if(reply.toString().startsWith("220"))
		   if(comm("USER "+_user))
					if(comm("PASS "+_pass))
									successful=true;
		comm("TYPE A");
		return successful;
	}

/**取得当前所在目录*/
protected String getCurrentDir()throws IOException
{
String currentDir=null;
if(comm("PWD"))
	{
	StringTokenizer st=new StringTokenizer(_reply);
	st.nextToken();
	StringBuffer rtDir=new StringBuffer(st.nextToken());
	currentDir=rtDir.substring(1,rtDir.length()-1);
	}
return currentDir;
}

/**列出站点中所有的目录、子目录和文件,存入_result属性变量,和一个名为“result.txt”的文件。
	*<br>并产生一个名为”Log.txt“日志文件。*/
public void search()throws IOException,InterruptedException
	{
		try
			{		
				for(int i=0;i<5;i++)
						{
							if(login())break;
		    			System.out.println("Wait 10 seconds to try again...");
							sleep(10000);
						}
				scan();
				logout();
			}
		catch(IOException ex)
			{
				
			}
		finally
			{
					  PrintStream out=new PrintStream(new FileOutputStream("Log.txt"));//会自动创建一个文件
						out.println(_log);
						out.close();
						printResult("result.txt");					
			}
				
	}
	

protected void scan()throws IOException
	{
	  Vector fileNames=new Vector();
		tellPort();
		comm("LIST -R");
		
		//Get data_connection's InputStream.
		try{
				 _ds=ss.accept();
											System.out.println(ss.toString());
			 }
		catch(IOException ex){ss.close();}
		_dataIn  = new BufferedReader(new  InputStreamReader(_ds.getInputStream())); 
		
		System.out.println("Scanning now.Please waiting......");
		//Read directory content
		try{
				String temp="";
				do {
						temp=_dataIn.readLine();
						if(temp==null)break;
						fileNames.add(temp);
						//System.out.println(temp);
					 }
				while(temp!=null);
				}
		catch(InterruptedIOException ex)
				{System.out.println("Caught InterruptedIOException1:"+ex);}  //如果超时则继续
				
		//Read end infomation
		try{
				do {
						String temp=_in.readLine();
						_log.append(temp+"\r\n");
						System.out.println(temp);
			 			}
				while(_in.ready());
				}
		catch(InterruptedIOException ex)
				{System.out.println("Caught InterruptedIOException2:"+ex);}  //如果超时则继续
					
	
		_result=fileNames;

	}

/**得到搜索结果向量。<br>记住要在执行search()方法后执行。*/
public Vector getResult()
	{
		return _result;
	}

/**得到搜索日志。<br>记住要在执行search()方法后执行。*/
public StringBuffer getLog()
	{
		return _log;
	}

/**分析得到的_result各成员,分辨目录、文件、及其他*/
public static Vector parse()throws FileNotFoundException,IOException
	{
		Vector  result=new Vector();
		FileInputStream fileIn=new FileInputStream("result.txt");
		BufferedReader fReader=new BufferedReader(new InputStreamReader(fileIn));
		//int size=fileIn.available();
		//System.out.println(String.valueOf(size));
		String dir="/";
		System.out.println("Parsing now.Please wait......");
		while(fReader.ready())
				{
					String temp=fReader.readLine();
					StringTokenizer tt=new StringTokenizer(temp);

					if(tt.countTokens()==1)
							{
								
								if(temp.startsWith("/"))dir=temp.replace(':',' ').trim()+"/";
								else dir="/"+temp.replace(':',' ').trim()+"/";
								//parseResult.add(dir);
								continue;
							}	
					if((!temp.equals(""))&&(temp.startsWith("-")||temp.startsWith("b")||temp.startsWith("c")||temp.startsWith("l")))
					//是文件就加上dir加入parseResult.
							{
								for(int i=0;i<4;i++)tt.nextToken();
								String description="";
								for(int i=0;i<4;i++)description=description+tt.nextToken()+" ";
								String cont="";
								do{cont=cont+tt.nextToken()+" ";}
								while(tt.hasMoreTokens());							
								result.add(new FileInfo(dir+cont.trim(),description.trim()));
								continue;
							}
					else if(  temp.startsWith("d"))//是目录
							{
								for(int i=0;i<4;i++)tt.nextToken();
								String description="";
								for(int i=0;i<4;i++)description=description+tt.nextToken()+" ";
								String cont="";
								do{cont=cont+tt.nextToken()+" ";}
								while(tt.hasMoreTokens());							
								result.add(new FileInfo(dir+cont.trim()+"/",description.trim()));
								continue;
							}
					else if(temp.equals(""))
							{
								continue;
							}
				}
		return result;
	}

protected void logout()throws IOException
	{
		comm("QUIT");
	}
	
protected void printResult(String resultFile)throws IOException
{
  PrintStream out=new PrintStream(new FileOutputStream(resultFile));//会自动创建一个文件
  int len=_result.size();
  for ( int i=0;i<len;i++)
		{
		 out.println(_result.elementAt(i));
		}
  out.close();
}
	
	
protected boolean comm(String command)throws IOException
	{ 
	  boolean success=false;
		_out.println(command);
		System.out.println("<COMMAND>"+command);
		_log.append("<COMMAND>"+command+"\r\n");
		_reply=readReply();
		if(command.startsWith("USER"))
			{
				success=_reply.startsWith("331")?true:false;
			}
		else if(command.startsWith("PASS"))
			{
				success=_reply.startsWith("230")?true:false;				
				try{readReply();}
				catch(InterruptedIOException ex){}
			}
		else if(command.equals("TYPE A"))
			{
				success=_reply.startsWith("200")?true:false;				
			}		
		else if(command.startsWith("PORT"))
			{
				success=_reply.startsWith("200")?true:false;				
			}		
		else if(command.startsWith("LIST"))
			{
				success=_reply.startsWith("150")?true:false;				
			}
		else if(command.startsWith("NLST"))
			{
				success=_reply.startsWith("150")?true:false;				
			}
		else if(command.equals("PWD"))
			{
				success=_reply.startsWith("257")?true:false;				
			}
		else if(command.startsWith("STAT"))
			{
				success=_reply.startsWith("211")?true:false;				
			}
		else if(command.equals("SYST"))
			{
				success=_reply.startsWith("215")?true:false;								
			}
		else if(command.startsWith("SITE"))
			{
				success=_reply.startsWith("214")?true:false;								
			}
		else if(command.equals("QUIT"))
			{
				success=_reply.startsWith("221")?true:false;				
			}
		return success;
	}


/**把指定向量中的内容在标准输出打印出来。*/
public static void printVector(Vector vct)
	{
		int size=vct.size();
		for(int i=0;i<size;i++)
			{
				System.out.println(vct.elementAt(i));
			}
	}	
	

protected String readReply()throws IOException, InterruptedIOException
	{
	  StringBuffer reply=new StringBuffer();
		do {
				reply.append(_in.readLine()+"\r\n");
			 }
		while(_in.ready());
		System.out.println(reply);
		_log.append(reply);
		_reply=reply.toString();
		return _reply;
	}
	
private int getDataPort()
		{ int port=_sc.getLocalPort()+1;
			return port;
		}

private void tellPort()throws IOException
		{
				
			try{
				int port=getDataPort();			
				System.out.println("Get data port:"+port);
				int x=(int) Math.round((port/256)-0.5);
				int y=port-x*256;
				try
					{
						ss=new ServerSocket(port);
					}
				catch(IOException ex){System.out.println("IOException in Method tellPort() in Class ftpc--"+ex);}
				comm("PORT "+_hostAddress+","+x+","+y);
				}
			finally{
						
						}
		}


public static void main(String arg[])//throws IOException,UnknownHostException,InterruptedException
	{
		try{
		FTPSearch client=new FTPSearch("202.114.2.2");
		client.search();
		client.parse();
		}
		catch(Exception ex)//probably catch IOException,UnknownHostException,InterruptedException
		{
			System.out.println(ex);
		}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -