我在用FtpClient做一个FTP上传的问题。
一般的步骤:
1 FtpClient ftpclient=new FtpClient()
2 ftpclient.openServer(ipAddress, ipPort);
3 ftpclient.login(userName, PassWord);
4 do something..
5 ftpclient.closeServer()由于这个ftp链接有个时候会用的很频繁,有的时候也可能长时间不用,我不想在ftp使用很频繁的时候不停的做链接和断开操作(怕让费资源),又不想在长时间不使用这个ftp的时候让它与服务器总保持着链接状态(也是怕让费资源)
所以我想在每次建立了链接并传输了文件以后不立即关闭链接(即在执行了第4步以后不会立即执行第5步),而是设置一个链接超时让链接自动关闭,当再次使用这个链接的时候先检查一下ftp的链接状态,在执行后面的操作。于是我改成了这样:
1 FtpClient ftpclient=new FtpClient()
2 ftpclient.openServer(ipAddress, ipPort);
3 ftpclient.login(userName, PassWord);
4 ftpclient.setConnectTimeout(int arg);
5 if(ftpclient.serverIsOpen()) do something..
else 重新链接现在的问题
1、ftpclient.setConnectTimeout(int arg); 里面的参数应该是时间吧,但是这个时间的单位是什么呢?秒?还是毫秒?还是其他的什么?怎么我将arg的值 设为 2 60 5000 然后等了10分钟都没什么效果啊?
2、除非调用了 ftpclient.closeServer()方法 否则ftpclient.serverIsOpen() 恒为true,那么我怎么才能判断链接状态呢? 这个程序要怎么写才能得到我想要的效果呢?大家帮帮忙啊,分不够可以在加分。
一般的步骤:
1 FtpClient ftpclient=new FtpClient()
2 ftpclient.openServer(ipAddress, ipPort);
3 ftpclient.login(userName, PassWord);
4 do something..
5 ftpclient.closeServer()由于这个ftp链接有个时候会用的很频繁,有的时候也可能长时间不用,我不想在ftp使用很频繁的时候不停的做链接和断开操作(怕让费资源),又不想在长时间不使用这个ftp的时候让它与服务器总保持着链接状态(也是怕让费资源)
所以我想在每次建立了链接并传输了文件以后不立即关闭链接(即在执行了第4步以后不会立即执行第5步),而是设置一个链接超时让链接自动关闭,当再次使用这个链接的时候先检查一下ftp的链接状态,在执行后面的操作。于是我改成了这样:
1 FtpClient ftpclient=new FtpClient()
2 ftpclient.openServer(ipAddress, ipPort);
3 ftpclient.login(userName, PassWord);
4 ftpclient.setConnectTimeout(int arg);
5 if(ftpclient.serverIsOpen()) do something..
else 重新链接现在的问题
1、ftpclient.setConnectTimeout(int arg); 里面的参数应该是时间吧,但是这个时间的单位是什么呢?秒?还是毫秒?还是其他的什么?怎么我将arg的值 设为 2 60 5000 然后等了10分钟都没什么效果啊?
2、除非调用了 ftpclient.closeServer()方法 否则ftpclient.serverIsOpen() 恒为true,那么我怎么才能判断链接状态呢? 这个程序要怎么写才能得到我想要的效果呢?大家帮帮忙啊,分不够可以在加分。
import java.io.FileInputStream;
import java.io.IOException;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* @author simplelife
* @version 1.0
*
*/
public class FtpTool{
private FtpClient ftp;
public FtpTool(String host,int port)throws IOException{
ftp = new FtpClient();
ftp.openServer(host, port);
}
public String login(String username,String password)throws IOException{
this.ftp.login(username, password);
return this.ftp.welcomeMsg;
}
/**
* 此方法用来上传文件。
* @param pathname 本地路径;filename 要上传的文件名称
*
*/
public void upload(String pathname,String filename,String s3)throws IOException{
if(!this.ftp.serverIsOpen()){
System.out.println("服务器连接不可用!");
}
this.ftp.binary();
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//aa是fpt上面的文件夹
os = this.ftp.put("aa/"+filename);
java.io.File file_in = new java.io.File(s3);
if (file_in.length()==0) {
System.out.println("上传文件为空!");
}
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
System.out.println("上传文件成功!");
this.ftp.ascii();
}
public void download(String pathname,String filename)throws IOException{
}
public static void main(String[] args)
{
//随便写的。盘符,文件名,路径
kk("e:","001.gif","e:/aa/001.gif");
}
public static void kk(String s,String s1,String s2)
{
try{
FtpTool ftpt = new FtpTool("ip",21);
String welstr = ftpt.login("帐号", "密码");
System.out.println(welstr);
ftpt.upload(s,s1,s2);
}
catch(IOException ioe)
{
System.out.println("异常哦");
ioe.printStackTrace();
}
}
}
我已经调通过了,肯定能用!
你的程序确实可以运行,但是还是没达到我要的效果。
你有没有试过让 代码:System.out.println("服务器连接不可用!"); 运行列?在你的代码里面好像没有执行 ftpclient.closeServer() 吧,那么this.ftp.serverIsOpen()的结果是恒为true的。
而在FTP服务器上是可以设置将一段时间没有试用过的链接踢出的,那么这个时候 你的代码就不能执行了。
用线程来做关闭操作,先让线程sleep(time),然后执行关闭操作;run{
sleep(time);
if (this.ftp.serverIsOpen()){
ftpclient.closeServer()
}
}