我在用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我没用过。建议用线程或者timer去管理你的连接。
      

  2.   

    package a;
    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();
            }
     }
    }
    我已经调通过了,肯定能用!
      

  3.   

    感谢楼上的!
    你的程序确实可以运行,但是还是没达到我要的效果。
    你有没有试过让  代码:System.out.println("服务器连接不可用!"); 运行列?在你的代码里面好像没有执行  ftpclient.closeServer() 吧,那么this.ftp.serverIsOpen()的结果是恒为true的。
    而在FTP服务器上是可以设置将一段时间没有试用过的链接踢出的,那么这个时候 你的代码就不能执行了。
      

  4.   

    每次操作前,先判断是否是连接状态,不是就进行连接,然后do something;
    用线程来做关闭操作,先让线程sleep(time),然后执行关闭操作;run{
       sleep(time);
       if (this.ftp.serverIsOpen()){
          ftpclient.closeServer()
       }
    }
      

  5.   

    要注意时间的控制,因为可能你设定5分钟后关闭server,但在4分钟时你有操作,可以在run里加个控制变量,有操作时,让线程结束,操作完后,再重新启动线程;呵呵,只是个思路。