1. 程式人生 > >ftpClient的連線超時設定(setConnectTimeout,setSoTimeout)

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 connecttimeout. It provides a default socket timeout. Only in J2SE 1.4 was theability to specify a timeout on connect added to the Socket API. SinceCommons Net 1.2.x has a J2SE 1.2 compatibility requirement, the abilityto specify a connect timeout is not included. The way to workaroundthis 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 createSocketmethods, use the J2SE 1.4 connect method with the timeout. We couldactually provide socket factory that subclasses DefaultSocketFactory
to do this without breaking backward compatibility, but that would haveto be discussed further. The way to do it is to compile it only if J2SE>= 1.4 is being used. SocketClient could check foravailability 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 theconnect timeout in the new factory if being used. If users want thisfunctionality enough, the best chance of getting it implemented soon isto 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這個版本對這個問題進行了完善和增強,可以這麼簡單的實現了。