MultihomePlainSocketFactorypublic final class MultihomePlainSocketFactory extends Object implements SocketFactorySocket 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_FACTORYThe factory singleton. |
Constructors Summary |
---|
private MultihomePlainSocketFactory()Restricted default constructor.
super();
|
Methods Summary |
---|
public java.net.Socket | connectSocket(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.
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.Socket | createSocket()
return new Socket();
| public boolean | equals(java.lang.Object obj)Compares this factory with an object.
There is only one instance of this class.
return (obj == this);
| public static org.apache.http.conn.MultihomePlainSocketFactory | getSocketFactory()Gets the singleton instance of this class.
return DEFAULT_FACTORY;
| public int | hashCode()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 boolean | isSecure(java.net.Socket sock)Checks whether a socket connection is secure.
This factory creates plain socket connections
which are not considered secure.
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;
|
|