151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage javax.net; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.InetAddress; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.Socket; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.SocketException; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.UnknownHostException; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class creates sockets. It may be subclassed by other factories, 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which create particular subclasses of sockets and thus provide a general 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * framework for the addition of public socket-level functionality. 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> Socket factories are a simple way to capture a variety of policies 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * related to the sockets being constructed, producing such sockets in 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a way which does not require special configuration of the code which 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * asks for the sockets: <UL> 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> Due to polymorphism of both factories and sockets, different 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * kinds of sockets can be used by the same application code just 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by passing it different kinds of factories. 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> Factories can themselves be customized with parameters used 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in socket construction. So for example, factories could be 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * customized to return sockets with different networking timeouts 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or security parameters already configured. 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> The sockets returned to the application can be subclasses 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of java.net.Socket, so that they can directly expose new APIs 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for features such as compression, security, record marking, 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * statistics collection, or firewall tunneling. 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </UL> 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> Factory classes are specified by environment-specific configuration 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mechanisms. For example, the <em>getDefault</em> method could return 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a factory that was appropriate for a particular user or applet, and a 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * framework could use a factory customized to its own purposes. 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see ServerSocketFactory 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Brownell 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class SocketFactory 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // NOTE: JDK 1.1 bug in class GC, this can get collected 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // even though it's always accessible via getDefault(). 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static SocketFactory theFactory; 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a <code>SocketFactory</code>. 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected SocketFactory() { /* NOTHING */ } 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a copy of the environment's default socket factory. 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the default <code>SocketFactory</code> 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static SocketFactory getDefault() 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (SocketFactory.class) { 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (theFactory == null) { 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Different implementations of this method SHOULD 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // work rather differently. For example, driving 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // this from a system property, or using a different 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // implementation than JavaSoft's. 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski theFactory = new DefaultSocketFactory(); 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return theFactory; 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10700b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath /** @hide Visible for testing only */ 10800b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath public static void setDefault(SocketFactory factory) { 10900b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath synchronized (SocketFactory.class) { 11000b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath theFactory = factory; 11100b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath } 11200b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath } 11300b854ea43c5e05bf72afed5f725b322de445dd9Narayan Kamath 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an unconnected socket. 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the unconnected socket 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if the socket cannot be created 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#connect(java.net.SocketAddress) 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#connect(java.net.SocketAddress, int) 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#Socket() 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket() throws IOException { 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // bug 6771432: 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The Exception is used by HttpsClient to signal that 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // unconnected sockets have not been implemented. 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UnsupportedOperationException uop = new 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski UnsupportedOperationException(); 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SocketException se = new SocketException( 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Unconnected sockets not implemented"); 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski se.initCause(uop); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw se; 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a socket and connects it to the specified remote host 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * at the specified remote port. This socket is configured using 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the socket options established for this factory. 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If there is a security manager, its <code>checkConnect</code> 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is called with the host address and <code>port</code> 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments. This could result in a SecurityException. 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the server host name with which to connect, or 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> for the loopback address. 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the server port 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Socket</code> 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error occurs when creating the socket 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException if a security manager exists and its 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method doesn't allow the operation. 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnknownHostException if the host is not known 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the port parameter is outside the 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified range of valid port values, which is between 0 and 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 65535, inclusive. 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#Socket(String, int) 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Socket createSocket(String host, int port) 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException, UnknownHostException; 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a socket and connects it to the specified remote host 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on the specified remote port. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The socket will also be bound to the local address and port supplied. 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This socket is configured using 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the socket options established for this factory. 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If there is a security manager, its <code>checkConnect</code> 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is called with the host address and <code>port</code> 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments. This could result in a SecurityException. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the server host name with which to connect, or 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> for the loopback address. 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the server port 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param localHost the local address the socket is bound to 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param localPort the local port the socket is bound to 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Socket</code> 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error occurs when creating the socket 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException if a security manager exists and its 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method doesn't allow the operation. 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnknownHostException if the host is not known 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the port parameter or localPort 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter is outside the specified range of valid port values, 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which is between 0 and 65535, inclusive. 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#Socket(String, int, java.net.InetAddress, int) 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Socket 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski createSocket(String host, int port, InetAddress localHost, int localPort) 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException, UnknownHostException; 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a socket and connects it to the specified port number 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * at the specified address. This socket is configured using 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the socket options established for this factory. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If there is a security manager, its <code>checkConnect</code> 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is called with the host address and <code>port</code> 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments. This could result in a SecurityException. 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param host the server host 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the server port 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Socket</code> 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error occurs when creating the socket 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException if a security manager exists and its 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method doesn't allow the operation. 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the port parameter is outside the 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified range of valid port values, which is between 0 and 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 65535, inclusive. 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if <code>host</code> is null. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#Socket(java.net.InetAddress, int) 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Socket createSocket(InetAddress host, int port) 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a socket and connect it to the specified remote address 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on the specified remote port. The socket will also be bound 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the local address and port suplied. The socket is configured using 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the socket options established for this factory. 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If there is a security manager, its <code>checkConnect</code> 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is called with the host address and <code>port</code> 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * as its arguments. This could result in a SecurityException. 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param address the server network address 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param port the server port 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param localAddress the client network address 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param localPort the client port 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the <code>Socket</code> 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException if an I/O error occurs when creating the socket 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException if a security manager exists and its 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>checkConnect</code> method doesn't allow the operation. 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the port parameter or localPort 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter is outside the specified range of valid port values, 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * which is between 0 and 65535, inclusive. 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NullPointerException if <code>address</code> is null. 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see SecurityManager#checkConnect 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.net.Socket#Socket(java.net.InetAddress, int, 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.net.InetAddress, int) 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Socket 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski createSocket(InetAddress address, int port, 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress localAddress, int localPort) 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// The default factory has NO intelligence about policies like tunneling 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// out through firewalls (e.g. SOCKS V4 or V5) or in through them 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// (e.g. using SSL), or that some ports are reserved for use with SSL. 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Note that at least JDK 1.1 has a low level "plainSocketImpl" that 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// knows about SOCKS V4 tunneling, so this isn't a totally bogus default. 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// ALSO: we may want to expose this class somewhere so other folk 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// can reuse it, particularly if we start to add highly useful features 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// such as ability to set connect timeouts. 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiclass DefaultSocketFactory extends SocketFactory { 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket() { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Socket(); 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket(String host, int port) 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException, UnknownHostException 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Socket(host, port); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket(InetAddress address, int port) 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Socket(address, port); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket(String host, int port, 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress clientAddress, int clientPort) 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException, UnknownHostException 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Socket(host, port, clientAddress, clientPort); 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Socket createSocket(InetAddress address, int port, 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski InetAddress clientAddress, int clientPort) 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Socket(address, port, clientAddress, clientPort); 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 301