| /* |
| * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| |
| package javax.net; |
| |
| import java.io.IOException; |
| import java.net.InetAddress; |
| import java.net.Socket; |
| import java.net.SocketException; |
| import java.net.UnknownHostException; |
| |
| /** |
| * This class creates sockets. It may be subclassed by other factories, |
| * which create particular subclasses of sockets and thus provide a general |
| * framework for the addition of public socket-level functionality. |
| * |
| * <P> Socket factories are a simple way to capture a variety of policies |
| * related to the sockets being constructed, producing such sockets in |
| * a way which does not require special configuration of the code which |
| * asks for the sockets: <UL> |
| * |
| * <LI> Due to polymorphism of both factories and sockets, different |
| * kinds of sockets can be used by the same application code just |
| * by passing it different kinds of factories. |
| * |
| * <LI> Factories can themselves be customized with parameters used |
| * in socket construction. So for example, factories could be |
| * customized to return sockets with different networking timeouts |
| * or security parameters already configured. |
| * |
| * <LI> The sockets returned to the application can be subclasses |
| * of java.net.Socket, so that they can directly expose new APIs |
| * for features such as compression, security, record marking, |
| * statistics collection, or firewall tunneling. |
| * |
| * </UL> |
| * |
| * <P> Factory classes are specified by environment-specific configuration |
| * mechanisms. For example, the <em>getDefault</em> method could return |
| * a factory that was appropriate for a particular user or applet, and a |
| * framework could use a factory customized to its own purposes. |
| * |
| * @since 1.4 |
| * @see ServerSocketFactory |
| * |
| * @author David Brownell |
| */ |
| public abstract class SocketFactory |
| { |
| // |
| // NOTE: JDK 1.1 bug in class GC, this can get collected |
| // even though it's always accessible via getDefault(). |
| // |
| private static SocketFactory theFactory; |
| |
| /** |
| * Creates a <code>SocketFactory</code>. |
| */ |
| protected SocketFactory() { /* NOTHING */ } |
| |
| |
| /** |
| * Returns a copy of the environment's default socket factory. |
| * |
| * @return the default <code>SocketFactory</code> |
| */ |
| public static SocketFactory getDefault() |
| { |
| synchronized (SocketFactory.class) { |
| if (theFactory == null) { |
| // |
| // Different implementations of this method SHOULD |
| // work rather differently. For example, driving |
| // this from a system property, or using a different |
| // implementation than JavaSoft's. |
| // |
| theFactory = new DefaultSocketFactory(); |
| } |
| } |
| |
| return theFactory; |
| } |
| |
| // Android-added: Added method for testing default socket factory. |
| /** @hide Visible for testing only */ |
| public static void setDefault(SocketFactory factory) { |
| synchronized (SocketFactory.class) { |
| theFactory = factory; |
| } |
| } |
| |
| |
| /** |
| * Creates an unconnected socket. |
| * |
| * @return the unconnected socket |
| * @throws IOException if the socket cannot be created |
| * @see java.net.Socket#connect(java.net.SocketAddress) |
| * @see java.net.Socket#connect(java.net.SocketAddress, int) |
| * @see java.net.Socket#Socket() |
| */ |
| public Socket createSocket() throws IOException { |
| // |
| // bug 6771432: |
| // The Exception is used by HttpsClient to signal that |
| // unconnected sockets have not been implemented. |
| // |
| UnsupportedOperationException uop = new |
| UnsupportedOperationException(); |
| SocketException se = new SocketException( |
| "Unconnected sockets not implemented"); |
| se.initCause(uop); |
| throw se; |
| } |
| |
| |
| /** |
| * Creates a socket and connects it to the specified remote host |
| * at the specified remote port. This socket is configured using |
| * the socket options established for this factory. |
| * <p> |
| * If there is a security manager, its <code>checkConnect</code> |
| * method is called with the host address and <code>port</code> |
| * as its arguments. This could result in a SecurityException. |
| * |
| * @param host the server host name with which to connect, or |
| * <code>null</code> for the loopback address. |
| * @param port the server port |
| * @return the <code>Socket</code> |
| * @throws IOException if an I/O error occurs when creating the socket |
| * @throws SecurityException if a security manager exists and its |
| * <code>checkConnect</code> method doesn't allow the operation. |
| * @throws UnknownHostException if the host is not known |
| * @throws IllegalArgumentException if the port parameter is outside the |
| * specified range of valid port values, which is between 0 and |
| * 65535, inclusive. |
| * @see SecurityManager#checkConnect |
| * @see java.net.Socket#Socket(String, int) |
| */ |
| public abstract Socket createSocket(String host, int port) |
| throws IOException, UnknownHostException; |
| |
| |
| /** |
| * Creates a socket and connects it to the specified remote host |
| * on the specified remote port. |
| * The socket will also be bound to the local address and port supplied. |
| * This socket is configured using |
| * the socket options established for this factory. |
| * <p> |
| * If there is a security manager, its <code>checkConnect</code> |
| * method is called with the host address and <code>port</code> |
| * as its arguments. This could result in a SecurityException. |
| * |
| * @param host the server host name with which to connect, or |
| * <code>null</code> for the loopback address. |
| * @param port the server port |
| * @param localHost the local address the socket is bound to |
| * @param localPort the local port the socket is bound to |
| * @return the <code>Socket</code> |
| * @throws IOException if an I/O error occurs when creating the socket |
| * @throws SecurityException if a security manager exists and its |
| * <code>checkConnect</code> method doesn't allow the operation. |
| * @throws UnknownHostException if the host is not known |
| * @throws IllegalArgumentException if the port parameter or localPort |
| * parameter is outside the specified range of valid port values, |
| * which is between 0 and 65535, inclusive. |
| * @see SecurityManager#checkConnect |
| * @see java.net.Socket#Socket(String, int, java.net.InetAddress, int) |
| */ |
| public abstract Socket |
| createSocket(String host, int port, InetAddress localHost, int localPort) |
| throws IOException, UnknownHostException; |
| |
| |
| /** |
| * Creates a socket and connects it to the specified port number |
| * at the specified address. This socket is configured using |
| * the socket options established for this factory. |
| * <p> |
| * If there is a security manager, its <code>checkConnect</code> |
| * method is called with the host address and <code>port</code> |
| * as its arguments. This could result in a SecurityException. |
| * |
| * @param host the server host |
| * @param port the server port |
| * @return the <code>Socket</code> |
| * @throws IOException if an I/O error occurs when creating the socket |
| * @throws SecurityException if a security manager exists and its |
| * <code>checkConnect</code> method doesn't allow the operation. |
| * @throws IllegalArgumentException if the port parameter is outside the |
| * specified range of valid port values, which is between 0 and |
| * 65535, inclusive. |
| * @throws NullPointerException if <code>host</code> is null. |
| * @see SecurityManager#checkConnect |
| * @see java.net.Socket#Socket(java.net.InetAddress, int) |
| */ |
| public abstract Socket createSocket(InetAddress host, int port) |
| throws IOException; |
| |
| |
| /** |
| * Creates a socket and connect it to the specified remote address |
| * on the specified remote port. The socket will also be bound |
| * to the local address and port suplied. The socket is configured using |
| * the socket options established for this factory. |
| * <p> |
| * If there is a security manager, its <code>checkConnect</code> |
| * method is called with the host address and <code>port</code> |
| * as its arguments. This could result in a SecurityException. |
| * |
| * @param address the server network address |
| * @param port the server port |
| * @param localAddress the client network address |
| * @param localPort the client port |
| * @return the <code>Socket</code> |
| * @throws IOException if an I/O error occurs when creating the socket |
| * @throws SecurityException if a security manager exists and its |
| * <code>checkConnect</code> method doesn't allow the operation. |
| * @throws IllegalArgumentException if the port parameter or localPort |
| * parameter is outside the specified range of valid port values, |
| * which is between 0 and 65535, inclusive. |
| * @throws NullPointerException if <code>address</code> is null. |
| * @see SecurityManager#checkConnect |
| * @see java.net.Socket#Socket(java.net.InetAddress, int, |
| * java.net.InetAddress, int) |
| */ |
| public abstract Socket |
| createSocket(InetAddress address, int port, |
| InetAddress localAddress, int localPort) |
| throws IOException; |
| } |
| |
| |
| // |
| // The default factory has NO intelligence about policies like tunneling |
| // out through firewalls (e.g. SOCKS V4 or V5) or in through them |
| // (e.g. using SSL), or that some ports are reserved for use with SSL. |
| // |
| // Note that at least JDK 1.1 has a low level "plainSocketImpl" that |
| // knows about SOCKS V4 tunneling, so this isn't a totally bogus default. |
| // |
| // ALSO: we may want to expose this class somewhere so other folk |
| // can reuse it, particularly if we start to add highly useful features |
| // such as ability to set connect timeouts. |
| // |
| class DefaultSocketFactory extends SocketFactory { |
| |
| public Socket createSocket() { |
| return new Socket(); |
| } |
| |
| public Socket createSocket(String host, int port) |
| throws IOException, UnknownHostException |
| { |
| return new Socket(host, port); |
| } |
| |
| public Socket createSocket(InetAddress address, int port) |
| throws IOException |
| { |
| return new Socket(address, port); |
| } |
| |
| public Socket createSocket(String host, int port, |
| InetAddress clientAddress, int clientPort) |
| throws IOException, UnknownHostException |
| { |
| return new Socket(host, port, clientAddress, clientPort); |
| } |
| |
| public Socket createSocket(InetAddress address, int port, |
| InetAddress clientAddress, int clientPort) |
| throws IOException |
| { |
| return new Socket(address, port, clientAddress, clientPort); |
| } |
| } |