?? ftpsearch.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 + -