1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * https://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.net; 19 20 import java.io.IOException; 21 import java.net.InetAddress; 22 import java.net.InetSocketAddress; 23 import java.net.Proxy; 24 import java.net.ServerSocket; 25 import java.net.Socket; 26 import java.net.UnknownHostException; 27 28 import javax.net.SocketFactory; 29 30 /** 31 * DefaultSocketFactory implements the SocketFactory interface by simply wrapping the java.net.Socket and java.net.ServerSocket constructors. It is the default 32 * SocketFactory used by {@link org.apache.commons.net.SocketClient} implementations. 33 * 34 * 35 * @see SocketFactory 36 * @see SocketClient 37 * @see SocketClient#setSocketFactory 38 */ 39 public class DefaultSocketFactory extends SocketFactory { 40 /** The proxy to use when creating new sockets. */ 41 private final Proxy connProxy; 42 43 /** 44 * Constructs a new instance. 45 */ 46 public DefaultSocketFactory() { 47 this(null); 48 } 49 50 /** 51 * A constructor for sockets with proxy support. 52 * 53 * @param proxy The Proxy to use when creating new Sockets. 54 * @since 3.2 55 */ 56 public DefaultSocketFactory(final Proxy proxy) { 57 connProxy = proxy; 58 } 59 60 /** 61 * Creates a ServerSocket bound to a specified port. A port of 0 will create the ServerSocket on a system-determined free port. 62 * 63 * @param port The port on which to listen, or 0 to use any free port. 64 * @return A ServerSocket that will listen on a specified port. 65 * @throws IOException If an I/O error occurs while creating the ServerSocket. 66 */ 67 public ServerSocket createServerSocket(final int port) throws IOException { 68 return new ServerSocket(port); 69 } 70 71 /** 72 * Creates a ServerSocket bound to a specified port with a given maximum queue length for incoming connections. A port of 0 will create the ServerSocket on 73 * a system-determined free port. 74 * 75 * @param port The port on which to listen, or 0 to use any free port. 76 * @param backlog The maximum length of the queue for incoming connections. 77 * @return A ServerSocket that will listen on a specified port. 78 * @throws IOException If an I/O error occurs while creating the ServerSocket. 79 */ 80 public ServerSocket createServerSocket(final int port, final int backlog) throws IOException { 81 return new ServerSocket(port, backlog); 82 } 83 84 /** 85 * Creates a ServerSocket bound to a specified port on a given local address with a given maximum queue length for incoming connections. A port of 0 will 86 * create the ServerSocket on a system-determined free port. 87 * 88 * @param port The port on which to listen, or 0 to use any free port. 89 * @param backlog The maximum length of the queue for incoming connections. 90 * @param bindAddr The local address to which the ServerSocket should bind. 91 * @return A ServerSocket that will listen on a specified port. 92 * @throws IOException If an I/O error occurs while creating the ServerSocket. 93 */ 94 public ServerSocket createServerSocket(final int port, final int backlog, final InetAddress bindAddr) throws IOException { 95 return new ServerSocket(port, backlog, bindAddr); 96 } 97 98 /** 99 * Creates an unconnected Socket. 100 * 101 * @return A new unconnected Socket. 102 * @throws IOException If an I/O error occurs while creating the Socket. 103 * @since 3.2 104 */ 105 @Override 106 public Socket createSocket() throws IOException { 107 if (connProxy != null) { 108 return new Socket(connProxy); 109 } 110 return new Socket(); 111 } 112 113 /** 114 * Creates a Socket connected to the given host and port. 115 * 116 * @param address The address of the host to connect to. 117 * @param port The port to connect to. 118 * @return A Socket connected to the given host and port. 119 * @throws IOException If an I/O error occurs while creating the Socket. 120 */ 121 @Override 122 public Socket createSocket(final InetAddress address, final int port) throws IOException { 123 if (connProxy != null) { 124 final Socket s = new Socket(connProxy); 125 s.connect(new InetSocketAddress(address, port)); 126 return s; 127 } 128 return new Socket(address, port); 129 } 130 131 /** 132 * Creates a Socket connected to the given host and port and originating from the specified local address and port. 133 * 134 * @param address The address of the host to connect to. 135 * @param port The port to connect to. 136 * @param localAddr The local address to use. 137 * @param localPort The local port to use. 138 * @return A Socket connected to the given host and port. 139 * @throws IOException If an I/O error occurs while creating the Socket. 140 */ 141 @Override 142 public Socket createSocket(final InetAddress address, final int port, final InetAddress localAddr, final int localPort) throws IOException { 143 if (connProxy != null) { 144 final Socket s = new Socket(connProxy); 145 s.bind(new InetSocketAddress(localAddr, localPort)); 146 s.connect(new InetSocketAddress(address, port)); 147 return s; 148 } 149 return new Socket(address, port, localAddr, localPort); 150 } 151 152 /** 153 * Creates a Socket connected to the given host and port. 154 * 155 * @param host The hostname to connect to. 156 * @param port The port to connect to. 157 * @return A Socket connected to the given host and port. 158 * @throws UnknownHostException If the hostname cannot be resolved. 159 * @throws IOException If an I/O error occurs while creating the Socket. 160 */ 161 @Override 162 public Socket createSocket(final String host, final int port) throws UnknownHostException, IOException { 163 if (connProxy != null) { 164 final Socket s = new Socket(connProxy); 165 s.connect(new InetSocketAddress(host, port)); 166 return s; 167 } 168 return new Socket(host, port); 169 } 170 171 /** 172 * Creates a Socket connected to the given host and port and originating from the specified local address and port. 173 * 174 * @param host The hostname to connect to. 175 * @param port The port to connect to. 176 * @param localAddr The local address to use. 177 * @param localPort The local port to use. 178 * @return A Socket connected to the given host and port. 179 * @throws UnknownHostException If the hostname cannot be resolved. 180 * @throws IOException If an I/O error occurs while creating the Socket. 181 */ 182 @Override 183 public Socket createSocket(final String host, final int port, final InetAddress localAddr, final int localPort) throws UnknownHostException, IOException { 184 if (connProxy != null) { 185 final Socket s = new Socket(connProxy); 186 s.bind(new InetSocketAddress(localAddr, localPort)); 187 s.connect(new InetSocketAddress(host, port)); 188 return s; 189 } 190 return new Socket(host, port, localAddr, localPort); 191 } 192 }