package waf.net.ftp;
import sun.net.ftp.*;
import java.io.*;
import sun.net.*;
public class FtpClient
{
private sun.net.ftp.FtpClient client=null;
private String strServerAddr="";
private int iServerPort=0;
private String strUserName="";
private String strUserPwd="";
private int iRetryTimes=0;
// 监测连接是否正常
public boolean CheckConn()
{
boolean bRet=false;
try
{
client.pwd();
bRet=true;
}
catch(IOException ex)
{
bRet=false;
}
return bRet;
}
private boolean Binary()
{
boolean bRet=false;
try
{
client.binary();
bRet=true;
}
catch(IOException ex)
{
bRet=false;
}
return bRet;
}
private boolean Ascii()
{
boolean bRet=false;
try
{
client.ascii();
bRet=true;
}
catch(IOException ex)
{
bRet=false;
}
return bRet;
}
public boolean GetTexFile(String strSrcFile,String strDestFile)
{
this.Ascii();
return GetFile(strSrcFile,strDestFile);
}
public boolean GetBinFile(String strSrcFile,String strDestFile)
{
this.Binary();
return GetFile(strSrcFile,strDestFile);
}
public boolean DisConnect()
{
boolean bRet=false;
try
{
client.closeServer();
bRet=true;
}
catch(IOException ex)
{
bRet=false;
}
return bRet;
}
public boolean GetBinFileWithReConnect(String strSrcFile,String strDestFile)
{
return GetBinFileWithReConnect(strSrcFile,strDestFile,3);
}
public boolean GetBinFileWithReConnect(String strSrcFile,String strDestFile,int iReTryTims)
{
boolean bRet=false;
iRetryTimes++;
// 尝试三次,失败放弃
if(iRetryTimes>=iReTryTims)
{
return false;
}
if(GetBinFile(strSrcFile,strDestFile))
{
bRet=true;
iRetryTimes=0;
}
else
{
bRet=false;
try
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
// 如果下载失败,就先监测一下连接状态,否则连接失效,就重新连接
if(!this.CheckConn())
{
// 如果是连接失效了,就重连,如果不是连接失效,那么就是文件不存在等错误,就放弃
if(ConnectTillSuc())
{
if(GetBinFileWithReConnect(strSrcFile,strDestFile,iReTryTims))
{
bRet=true;
iRetryTimes=0;
}
}
}
}
return bRet;
}
public boolean PutFile(String strSrcFile,String strDestFile)
{
boolean bRet=false;
try
{
TelnetOutputStream fput=client.put(strDestFile);
DataOutputStream puts = new DataOutputStream(fput);
File fi = new File(strSrcFile);
RandomAccessFile srcFile = new RandomAccessFile(fi,"rw");
srcFile.seek(0);
// 字节数组方式
boolean bReadBytes=true;
if(bReadBytes)
{
int iBufLen=4096;
byte[] b=new byte[iBufLen];
while(true)
{
int iRead=srcFile.read(b);
if(iRead<0)
{
break;
}
puts.write(b,0,iRead);
}
}
else
{
int ch;
while ((ch = srcFile.read()) >= 0)
{
puts.write(ch);
}
}
puts.close();
fput.close();
srcFile.close();
bRet=true;
System.out.print("put file suc from "+strSrcFile+" to "+strDestFile+"\r\n");
}
catch (IOException ex)
{
bRet=false;
ex.printStackTrace();
}
return bRet;
}
public boolean GetFile(String strSrcFile,String strDestFile)
{
boolean bRet=false;
try
{
TelnetInputStream fget=client.get(strSrcFile);
DataInputStream puts = new DataInputStream(fget);
File fi = new File(strDestFile);
RandomAccessFile getFile = new RandomAccessFile(fi,"rw");
getFile.seek(0);
// 字节数组方式
boolean bReadBytes=true;
if(bReadBytes)
{
int iBufLen=4096;
byte[] b=new byte[iBufLen];
while(true)
{
int iRead=puts.read(b);
if(iRead<0)
{
break;
}
getFile.write(b,0,iRead);
}
}
else
{
int ch;
while ((ch = puts.read()) >= 0)
{
getFile.write(ch);
}
}
fget.close();
getFile.close();
bRet=true;
System.out.print("get file suc from "+strSrcFile+" to "+strDestFile+"\r\n");
}
catch (IOException ex)
{
bRet=false;
ex.printStackTrace();
}
return bRet;
}
public boolean Connect(String ServerAddr,int ServerPort,String UserName,String UserPwd)
{
boolean bRet=false;
client=new sun.net.ftp.FtpClient();
this.strServerAddr=ServerAddr;
this.iServerPort=ServerPort;
this.strUserName=UserName;
this.strUserPwd=UserPwd;
try
{
client.openServer(strServerAddr,iServerPort);
client.login(strUserName, strUserPwd);
System.out.print("connect succeed\n");
bRet=true;
}
catch (IOException ex)
{
ex.printStackTrace();
bRet=false;
}
return bRet;
}
public boolean ConnectTillSuc()
{
return this.ConnectTillSuc(this.strServerAddr, this.iServerPort, this.strUserName, this.strUserPwd);
}
// 连接,直到成功
public boolean ConnectTillSuc(String ServerAddr,int ServerPort,String UserName,String UserPwd)
{
while(!this.Connect(ServerAddr, ServerPort, UserName, UserPwd))
{
try
{
System.out.print("connect failed,retry...\n");
Thread.sleep(3000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
return true;
}
public static void main(String[] args) throws IOException, InterruptedException
{
FtpClient client=new FtpClient();
// 常规方式
// client.GetBinFile("/abc/jdom.jar", "d:\\jdom.jar");
// client.Connect("127.0.0.1",21,"abc","abc");
// 自动重连和重试下载方式
// client.ConnectTillSuc("127.0.0.1",21,"abc","abc");
// for(int i=0;i<1000;i++)
// {
// client.GetBinFileWithReConnect("/abc/jdom.jar", "d:\\test\\jdom"+i+".jar");
// }
boolean b=client.ConnectTillSuc("127.0.0.1",21,"wd","wd");
for(int i=0;i<1;i++)
{
client.PutFile("D:\\temp\\2010-02-01.txt", "/2010-02-01.txt");
// System.out.print("get begin\n");
// client.GetBinFileWithReConnect("x:\\0091\\125904094\\Record\\20070208\\13911463641_20070208163821.vox","d:\\test\\t"+i+".vox");
// client.GetBinFileWithReConnect("x:\\0091\\125904094\\Record\\20060531181647_13409182464.VOX","d:\\test\\t"+i+".vox");
// System.out.print("get end\n\n");
Thread.sleep(1000*120);
}
client.DisConnect();
}
}