FileDocCategorySizeDatePackage
MultihomePlainSocketFactory.javaAPI DocAndroid 1.5 API7237Wed May 06 22:41:10 BST 2009org.apache.http.conn

MultihomePlainSocketFactory

public final class MultihomePlainSocketFactory extends Object implements SocketFactory
Socket factory that implements a simple multi-home fail-over on connect failure, provided the same hostname resolves to multiple {@link InetAddress}es. Please note the {@link #connectSocket(Socket, String, int, InetAddress, int, HttpParams)} method cannot be reliably interrupted by closing the socket returned by the {@link #createSocket()} method.

Fields Summary
private static final MultihomePlainSocketFactory
DEFAULT_FACTORY
The factory singleton.
Constructors Summary
private MultihomePlainSocketFactory()
Restricted default constructor.

        super();
    
Methods Summary
public java.net.SocketconnectSocket(java.net.Socket sock, java.lang.String host, int port, java.net.InetAddress localAddress, int localPort, org.apache.http.params.HttpParams params)
Attempts to connects the socket to any of the {@link InetAddress}es the given host name resolves to. If connection to all addresses fail, the last I/O exception is propagated to the caller.

param
sock socket to connect to any of the given addresses
param
host Host name to connect to
param
port the port to connect to
param
localAddress local address
param
localPort local port
param
params HTTP parameters
throws
IOException if an error occurs during the connection
throws
SocketTimeoutException if timeout expires before connecting


        if (host == null) {
            throw new IllegalArgumentException("Target host may not be null.");
        }
        if (params == null) {
            throw new IllegalArgumentException("Parameters may not be null.");
        }

        if (sock == null)
            sock = createSocket();

        if ((localAddress != null) || (localPort > 0)) {

            // we need to bind explicitly
            if (localPort < 0)
                localPort = 0; // indicates "any"

            InetSocketAddress isa =
                new InetSocketAddress(localAddress, localPort);
            sock.bind(isa);
        }

        int timeout = HttpConnectionParams.getConnectionTimeout(params);

        InetAddress[] inetadrs = InetAddress.getAllByName(host);
        List<InetAddress> addresses = new ArrayList<InetAddress>(inetadrs.length);
        addresses.addAll(Arrays.asList(inetadrs));
        Collections.shuffle(addresses);

        IOException lastEx = null;
        for (InetAddress address: addresses) {
            try {
                sock.connect(new InetSocketAddress(address, port), timeout);
                break;
            } catch (SocketTimeoutException ex) {
                throw ex;
            } catch (IOException ex) {
                // create new socket
                sock = new Socket();
                // keep the last exception and retry
                lastEx = ex;
            }
        }
        if (lastEx != null) {
            throw lastEx;
        }
        return sock;
    
public java.net.SocketcreateSocket()

        return new Socket();
    
public booleanequals(java.lang.Object obj)
Compares this factory with an object. There is only one instance of this class.

param
obj the object to compare with
return
iff the argument is this object

        return (obj == this);
    
public static org.apache.http.conn.MultihomePlainSocketFactorygetSocketFactory()
Gets the singleton instance of this class.

return
the one and only plain socket factory


                        
        
        return DEFAULT_FACTORY;
    
public inthashCode()
Obtains a hash code for this object. All instances of this class have the same hash code. There is only one instance of this class.

        return PlainSocketFactory.class.hashCode();
    
public final booleanisSecure(java.net.Socket sock)
Checks whether a socket connection is secure. This factory creates plain socket connections which are not considered secure.

param
sock the connected socket
return
false
throws
IllegalArgumentException if the argument is invalid


        if (sock == null) {
            throw new IllegalArgumentException("Socket may not be null.");
        }
        // This class check assumes that createSocket() calls the constructor
        // directly. If it was using javax.net.SocketFactory, we couldn't make
        // an assumption about the socket class here.
        if (sock.getClass() != Socket.class) {
            throw new IllegalArgumentException
                ("Socket not created by this factory.");
        }
        // This check is performed last since it calls a method implemented
        // by the argument object. getClass() is final in java.lang.Object.
        if (sock.isClosed()) {
            throw new IllegalArgumentException("Socket is closed.");
        }

        return false;