001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018package org.apache.commons.net; 019 020import java.io.IOException; 021import java.net.InetAddress; 022import java.net.InetSocketAddress; 023import java.net.Proxy; 024import java.net.ServerSocket; 025import java.net.Socket; 026import java.net.UnknownHostException; 027 028import javax.net.SocketFactory; 029 030/*** 031 * DefaultSocketFactory implements the SocketFactory interface by 032 * simply wrapping the java.net.Socket and java.net.ServerSocket 033 * constructors. It is the default SocketFactory used by 034 * {@link org.apache.commons.net.SocketClient} 035 * implementations. 036 * 037 * 038 * @see SocketFactory 039 * @see SocketClient 040 * @see SocketClient#setSocketFactory 041 ***/ 042 043public class DefaultSocketFactory extends SocketFactory 044{ 045 /** The proxy to use when creating new sockets. */ 046 private final Proxy connProxy; 047 048 /** 049 * The default constructor. 050 */ 051 public DefaultSocketFactory() 052 { 053 this(null); 054 } 055 056 /** 057 * A constructor for sockets with proxy support. 058 * 059 * @param proxy The Proxy to use when creating new Sockets. 060 * @since 3.2 061 */ 062 public DefaultSocketFactory(Proxy proxy) 063 { 064 connProxy = proxy; 065 } 066 067 /** 068 * Creates an unconnected Socket. 069 * 070 * @return A new unconnected Socket. 071 * @exception IOException If an I/O error occurs while creating the Socket. 072 * @since 3.2 073 */ 074 @Override 075 public Socket createSocket() throws IOException 076 { 077 if (connProxy != null) 078 { 079 return new Socket(connProxy); 080 } 081 return new Socket(); 082 } 083 084 /*** 085 * Creates a Socket connected to the given host and port. 086 * 087 * @param host The hostname to connect to. 088 * @param port The port to connect to. 089 * @return A Socket connected to the given host and port. 090 * @exception UnknownHostException If the hostname cannot be resolved. 091 * @exception IOException If an I/O error occurs while creating the Socket. 092 ***/ 093 @Override 094 public Socket createSocket(String host, int port) 095 throws UnknownHostException, IOException 096 { 097 if (connProxy != null) 098 { 099 Socket s = new Socket(connProxy); 100 s.connect(new InetSocketAddress(host, port)); 101 return s; 102 } 103 return new Socket(host, port); 104 } 105 106 /*** 107 * Creates a Socket connected to the given host and port. 108 * 109 * @param address The address of the host to connect to. 110 * @param port The port to connect to. 111 * @return A Socket connected to the given host and port. 112 * @exception IOException If an I/O error occurs while creating the Socket. 113 ***/ 114 @Override 115 public Socket createSocket(InetAddress address, int port) 116 throws IOException 117 { 118 if (connProxy != null) 119 { 120 Socket s = new Socket(connProxy); 121 s.connect(new InetSocketAddress(address, port)); 122 return s; 123 } 124 return new Socket(address, port); 125 } 126 127 /*** 128 * Creates a Socket connected to the given host and port and 129 * originating from the specified local address and port. 130 * 131 * @param host The hostname to connect to. 132 * @param port The port to connect to. 133 * @param localAddr The local address to use. 134 * @param localPort The local port to use. 135 * @return A Socket connected to the given host and port. 136 * @exception UnknownHostException If the hostname cannot be resolved. 137 * @exception IOException If an I/O error occurs while creating the Socket. 138 ***/ 139 @Override 140 public Socket createSocket(String host, int port, 141 InetAddress localAddr, int localPort) 142 throws UnknownHostException, IOException 143 { 144 if (connProxy != null) 145 { 146 Socket s = new Socket(connProxy); 147 s.bind(new InetSocketAddress(localAddr, localPort)); 148 s.connect(new InetSocketAddress(host, port)); 149 return s; 150 } 151 return new Socket(host, port, localAddr, localPort); 152 } 153 154 /*** 155 * Creates a Socket connected to the given host and port and 156 * originating from the specified local address and port. 157 * 158 * @param address The address of the host to connect to. 159 * @param port The port to connect to. 160 * @param localAddr The local address to use. 161 * @param localPort The local port to use. 162 * @return A Socket connected to the given host and port. 163 * @exception IOException If an I/O error occurs while creating the Socket. 164 ***/ 165 @Override 166 public Socket createSocket(InetAddress address, int port, 167 InetAddress localAddr, int localPort) 168 throws IOException 169 { 170 if (connProxy != null) 171 { 172 Socket s = new Socket(connProxy); 173 s.bind(new InetSocketAddress(localAddr, localPort)); 174 s.connect(new InetSocketAddress(address, port)); 175 return s; 176 } 177 return new Socket(address, port, localAddr, localPort); 178 } 179 180 /*** 181 * Creates a ServerSocket bound to a specified port. A port 182 * of 0 will create the ServerSocket on a system-determined free port. 183 * 184 * @param port The port on which to listen, or 0 to use any free port. 185 * @return A ServerSocket that will listen on a specified port. 186 * @exception IOException If an I/O error occurs while creating 187 * the ServerSocket. 188 ***/ 189 public ServerSocket createServerSocket(int port) throws IOException 190 { 191 return new ServerSocket(port); 192 } 193 194 /*** 195 * Creates a ServerSocket bound to a specified port with a given 196 * maximum queue length for incoming connections. A port of 0 will 197 * create the ServerSocket on a system-determined free port. 198 * 199 * @param port The port on which to listen, or 0 to use any free port. 200 * @param backlog The maximum length of the queue for incoming connections. 201 * @return A ServerSocket that will listen on a specified port. 202 * @exception IOException If an I/O error occurs while creating 203 * the ServerSocket. 204 ***/ 205 public ServerSocket createServerSocket(int port, int backlog) 206 throws IOException 207 { 208 return new ServerSocket(port, backlog); 209 } 210 211 /*** 212 * Creates a ServerSocket bound to a specified port on a given local 213 * address with a given maximum queue length for incoming connections. 214 * A port of 0 will 215 * create the ServerSocket on a system-determined free port. 216 * 217 * @param port The port on which to listen, or 0 to use any free port. 218 * @param backlog The maximum length of the queue for incoming connections. 219 * @param bindAddr The local address to which the ServerSocket should bind. 220 * @return A ServerSocket that will listen on a specified port. 221 * @exception IOException If an I/O error occurs while creating 222 * the ServerSocket. 223 ***/ 224 public ServerSocket createServerSocket(int port, int backlog, 225 InetAddress bindAddr) 226 throws IOException 227 { 228 return new ServerSocket(port, backlog, bindAddr); 229 } 230}