ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)

转载 2014年04月09日 17:59:27

http://blog.csdn.net/java2000_net/article/details/3723358

从 ftpClient的官方网的FAQ里面看到,实现这个需要用一个 自定义的SocketFactory
然后实现里面的 createSocket方法,有好多个。
http://wiki.apache.org/jakarta-commons/Net/FrequentlyAskedQuestions

原文如下:

Q: How can I set a connection timeout?

A: setDefaultTimeout does not set the connect timeout. It provides a default socket timeout. Only in J2SE 1.4 was the ability to specify a timeout on connect added to the Socket API. Since Commons Net 1.2.x has a J2SE 1.2 compatibility requirement, the ability to specify a connect timeout is not included. The way to workaround this is to implement your own SocketFactory and set it with SocketClient.setSocketFactory (FTPClient is a subclass of SocketClient). When you implement the SocketFactory, add a setConnectTimeout method or some such. Inside of the createSocket methods, use the J2SE 1.4 connect method with the timeout. We could actually provide socket factory that subclasses DefaultSocketFactory to do this without breaking backward compatibility, but that would have to be discussed further. The way to do it is to compile it only if J2SE >= 1.4 is being used. SocketClient could check for availability of the J2SE 1.4 connect method and instantiate the J2SE >= 1.4 factory if available (using Class.forName and newInstance). The setDefaultTimeout method could then be changed to also set the connect timeout in the new factory if being used. If users want this functionality enough, the best chance of getting it implemented soon is to submit a patch.



不过我看了 ftpClient 2.0的源代码。

 ftpClient.connect(hostName, 21);


看看 connect的代码如下
    public void connect(String hostname, int port)
    throws SocketException, IOException
    {
        _socket_= _socketFactory_.createSocket();
        _socket_.connect(new InetSocketAddress(hostname, port), connectTimeout);
       
        _connectAction_();
    }

其中有一个connectTimeout正是我们需要的连接超时,我们看看它的定义
    /** The socket's connect timeout (0 = infinite timeout) */
    private static final int DEFAULT_CONNECT_TIMEOUT = 0;
    protected int connectTimeout = DEFAULT_CONNECT_TIMEOUT;

可见默认是不限超时的。再搜索一下,找到如下这个方法
    /**
     * Sets the connection timeout in milliseconds, which will be passed to the {@link Socket} object's
     * connect() method.
     * @param connectTimeout The connection timeout to use (in ms)
     * @since 2.0
     */
    public void setConnectTimeout(int connectTimeout) {
        this.connectTimeout = connectTimeout;
    }
   
    /**
     * Get the underlying socket connection timeout.
     * @return
     * @since 2.0
     */
    public int getConnectTimeout() {
        return connectTimeout;
    }
   
可见,我们完全可以直接设置超时时间就行了。具体代码如下:

 FTPClient ftpClient = new FTPClient();
 ftpClient.setConnectTimeout(1000); // 一秒钟,如果超过就判定超时了
 ftpClient.connect(hostName, 21);


估计2,0这个版本对这个问题进行了完善和增强,可以这么简单的实现了。

 

http://www.docjar.com/html/api/examples/FTPSExample.java.html

FTP被动模式连接及超时问题解决

问题: 1、FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态。 2、连接FTP服务器,长时间进行数据...
  • alfily
  • alfily
  • 2015年05月20日 17:48
  • 14027

关于FtpClient的defaultTimeout、connectTimeout、dataTimeout的区别

在使用ftp中,往往为了程序不至于卡死,会设置timeout来保证程序正常运行。而FtpClient是一个非常实用的辅助类。好了,废话不多说。那三个timeout的区别如下: (1)defaultTi...
  • YANGYYID
  • YANGYYID
  • 2017年10月15日 17:21
  • 417

apache ftpClient 多网卡上传文件超时解决。

在服务器中有多个网卡,默认的路由不是当前的ftp服务器走的路由。              修改ftpclinent.java 中的代码实现。              protected S...
  • East271536394
  • East271536394
  • 2012年08月02日 21:14
  • 1931

ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)

从 ftpClient的官方网的FAQ里面看到,实现这个需要用一个 自定义的SocketFactory然后实现里面的 createSocket方法,有好多个。http://wiki.apache.or...
  • java2000_net
  • java2000_net
  • 2009年01月06日 21:33
  • 39604

FTPClient连接池的实现

最近在写一个FTP上传工具,用到了Apache的FTPClient,为了提高上传效率,我采用了多线程的方式,但是每个线程频繁的创建和销毁FTPClient对象势必会造成不必要的开销,因此,此处最好使用...
  • suifeng3051
  • suifeng3051
  • 2015年10月08日 10:59
  • 11809

FTP上传下载以及相关注意点

FTP上传下载
  • zahaa2012
  • zahaa2012
  • 2016年04月14日 11:28
  • 3706

Apache FTPClient操作“卡死”问题的分析和解决

声明:本文转自 http://www.cnblogs.com/CopyPaster/p/3494579.html      首先,感谢原博主写的这篇文章,帮了我很大忙,在进行FTPClient进...
  • W_ya24K
  • W_ya24K
  • 2015年12月08日 20:46
  • 4362

FTP读取远程文件&解决使用FTPClient类时线程挂起的问题

java FTP 下载读取文件
  • kunfd
  • kunfd
  • 2017年08月09日 14:58
  • 718

java实现FTP上传下载:FTPClient类进行FTP上传下载大文件(包含导致假死现象)

1.首先,程序中设置ftp请求方式为被动模式,即程序去请求ftp服务器,要求服务器来打开一个端口,让客户端传输文件。这是基本的,但是无法避免上传阻塞问题。 2.其次,设置连接超时,数据传输超时等等,也...
  • zzjstudent
  • zzjstudent
  • 2016年06月16日 15:28
  • 5983

linux下FTP拒绝(ftp: connect: Connection refused)

ftp> open 192.168.1.98 ftp: connect: Connection refused     解决办法: [root@rac1 etc]# vsftpd /etc/...
  • tanqingru
  • tanqingru
  • 2012年04月11日 14:33
  • 40100
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ftpClient的连接超时设置(setConnectTimeout,setSoTimeout)
举报原因:
原因补充:

(最多只允许输入30个字)