`

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

 
阅读更多

从 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这个版本对这个问题进行了完善和增强,可以这么简单的实现了。

分享到:
评论

相关推荐

    java ftpClient 连接池设计

    4. **超时与回收机制**:为了避免长时间未使用的连接占用资源,可以设定连接的超时时间,超过这个时间未使用的连接将被强制关闭并从池中移除。 5. **异常处理**:当FTP操作出现异常时,连接池需要能够捕获并处理...

    FTPClient连接池

    使用apache的commons-pool2 构建 FTPClient连接池 有FtpClientFactory、FtpClientPool、FtpConfig、FtpOperate 四个类组成 还有ftp连接池的一些配置参数信息在ftp.properties文件中 注释完整欢迎大家下载使用

    Java FTPClient连接池的实现

    Java FTPClient连接池的实现 在这篇文章中,我们主要介绍了Java FTPClient连接池的实现。首先,我们需要了解为什么需要使用连接池。创建和销毁FTPClient对象是非常耗费资源的操作,因此,我们可以使用连接池来复用...

    Spring Boot整合FTPClient线程池的实现示例

    Spring Boot 整合 FTPClient 线程池的实现示例 在本文中,我们将探讨如何在 Spring Boot 项目中整合 FTPClient 线程池的实现示例。FTPClient 是一个常用的 FTP 客户端库,而线程池则可以帮助我们减少频繁创建和销毁...

    springboot集成ftp连接池工具

    在实际应用中,你可以根据需求调整FTP连接池的参数,如连接数、超时时间等,以适应不同并发量的情况。同时,还可以通过异常处理和日志记录来监控FTP操作的状态,确保服务的稳定性和可靠性。 通过上述方式,Spring ...

    FTPClient用于java开发FTP客户端

    在Java中,FTPClient库提供了一个丰富的API,允许开发者执行各种FTP操作,如连接到FTP服务器、登录、上传文件、下载文件、改变目录、列出目录内容等。这个库不仅支持标准的FTP协议,还支持FTP over SSL/TLS(FTPS)...

    ftpclient所需jar包

    - `FTPClient`类:创建FTP连接,登录服务器,改变工作目录,上传和下载文件,设置传输模式等。 - `FTPFile`接口:表示FTP服务器上的文件或目录,提供了获取文件名、大小、修改日期等属性的方法。 - `FTPReply`类...

    Apache的FTPClient.jar

    8. 传输速率控制:`FTPClient.setDataTimeout(int timeout)`可以设置数据传输超时时间,以避免长时间无响应。 在使用Apache Commons Net的FTPClient时,要注意异常处理,如`FTPReply.isPositiveCompletion(reply)`...

    JavaFtpClient.rar_JAVAFTP_ftpclient

    // 设置超时时间 ftpClient.setDefaultPort(21); // FTP默认端口 ftpClient.connect("ftp.server.com"); // 连接服务器 ``` 连接成功后,需要登录FTP服务器。提供用户名和密码: ```java int reply = ftpClient....

    System.Net.FtpClient

    System.Net.FtpClient是.NET Framework中的一个开源库,专门用于执行FTP(文件传输协议)操作。这个库为C#开发者提供了一个方便、强大的接口,使他们能够轻松地实现FTP文件的上传、下载以及一系列相关任务,如目录...

    ftpclient

    1. **连接与断开**:程序可以使用FTPClient建立到FTP服务器的连接,并在完成任务后断开连接。这涉及设置主机名、端口号、用户名和密码。 2. **登录验证**:在连接到服务器后,用户需要通过用户名和密码进行身份验证...

    ftpclient 文件上传、下载、删除

    FTPClient是Java中实现FTP功能的一个库,它提供了丰富的API,使得开发者能够方便地与FTP服务器进行交互,包括上传、下载和删除文件。在这个项目中,我们将会深入探讨如何使用FTPClient来完成这些操作。 首先,要...

    commons-ftp中ftpClient类的API

    5. **设置和查询属性**:`FTPClient`支持设置和查询各种FTP属性,如文件传输类型、传输模式、文件结构等。默认情况下,`FTPClient`使用ASCII文件类型、非打印文本格式、流传输模式和文件结构。 6. **断开连接**:...

    FtpClientDemo

    例如,`FTPClient.setConnectTimeout()`用于设置连接超时时间。 3. **文件上传(PUT)**:使用`FTPClient.storeFile()`方法上传本地文件到服务器。需要先将FTPClient切换到二进制模式(`FTPClient.setFileType(FTP....

    FTPClient开发工具类及使用示例

    在使用FTPClient过程中,还可以设置各种参数以满足不同需求,如文件传输模式(ASCII或二进制)、被动模式、超时设置等。例如,切换到二进制模式用于处理非文本文件: ```java ftpClient.setFileType(FTP.BINARY_FILE...

    ftpclient英文api

    使用FTPClient,开发者可以连接到FTP服务器,设置各种参数如主动模式和被动模式,登录用户,以及处理文件传输。 1. **连接和登录**: - `FTPClient.connect(String server)`:连接到指定的FTP服务器。 - `...

    使用FTPClient实现ftp文件上传

    FTPClient类提供了丰富的功能,包括连接、登录、文件传输、目录操作等。 首先,要使用FTPClient,你需要在项目中引入Apache Commons Net库。通常,你可以通过Maven或Gradle将其添加为依赖项。例如,在Maven的pom....

    用org.apache.commons.net.ftp.FTPClient包实现简单文件下载

    这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你需要在项目中引入Apache Commons Net库。在这个例子中,我们有两个jar文件:`...

    FTPClient的jar包

    FTPClient的jar包 FTPClient ftpClient = new FTPClient(); ftpClient.connect("ftp.foo.com"); ftpClient.login("user01", "pass1234"); ftpClient.download("C:\\Temp\\&quo; t;, "README.txt"); // ...

Global site tag (gtag.js) - Google Analytics