1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage javax.net; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Socket; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This abstract class defines methods to create sockets. It can be subclassed 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to create specific socket types with additional socket-level functionality. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SocketFactory { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 32f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson private static SocketFactory defaultFactory; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the default socket factory of the system which can be used to create 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * new sockets without creating a subclass of this factory. 37f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the system default socket factory. 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static synchronized SocketFactory getDefault() { 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (defaultFactory == null) { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultFactory = new DefaultSocketFactory(); 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultFactory; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 48f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * Creates a new {@code SocketFactory} instance. 49f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 50f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson protected SocketFactory() { 51f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 52f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 53f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson /** 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new socket which is not connected to any remote host. This 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method has to be overridden by a subclass otherwise a {@code 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * SocketException} is thrown. 57f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the created unconnected socket. 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating a new socket. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket createSocket() throws IOException { 63f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson // follow RI's behavior 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException("Unconnected sockets not implemented"); 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new socket which is connected to the remote host specified by 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code host} and {@code port}. The socket is bound to any 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * available local address and port. 71f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host address the socket has to be connected to. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the remote host at which the socket is 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected. 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the created connected socket. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating a new socket. 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified host is unknown or the IP address could not 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be resolved. 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 84f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public abstract Socket createSocket(String host, int port) throws IOException, 85f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson UnknownHostException; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new socket which is connected to the remote host specified by 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code host} and {@code port}. The socket is bound to the 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * local network interface specified by the InetAddress {@code localHost} on 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port {@code localPort}. 92f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host address the socket has to be connected to. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the remote host at which the socket is 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localHost 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the local host address the socket is bound to. 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localPort 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the local host at which the socket is 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bound. 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the created connected socket. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating a new socket. 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified host is unknown or the IP address could not 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be resolved. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public abstract Socket createSocket(String host, int port, InetAddress localHost, int localPort) 111f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson throws IOException, UnknownHostException; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new socket which is connected to the remote host specified by 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the InetAddress {@code host}. The socket is bound to any available local 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * address and port. 117f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the host address the socket has to be connected to. 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the remote host at which the socket is 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected. 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the created connected socket. 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating a new socket. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public abstract Socket createSocket(InetAddress host, int port) throws IOException; 128f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new socket which is connected to the remote host specified by 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the InetAddress {@code address}. The socket is bound to the local network 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * interface specified by the InetAddress {@code localHost} on port {@code 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * localPort}. 135f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param address 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host address the socket has to be connected to. 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the remote host at which the socket is 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localAddress 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the local host address the socket is bound to. 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localPort 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number of the local host at which the socket is 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bound. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the created connected socket. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating a new socket. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 150f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public abstract Socket createSocket(InetAddress address, int port, InetAddress localAddress, 151f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson int localPort) throws IOException; 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 153