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 * http://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
32 * simply wrapping the java.net.Socket and java.net.ServerSocket
33 * constructors. It is the default SocketFactory used by
34 * {@link org.apache.commons.net.SocketClient}
35 * implementations.
36 * <p>
37 * <p>
38 * @see SocketFactory
39 * @see SocketClient
40 * @see SocketClient#setSocketFactory
41 ***/
42
43 public class DefaultSocketFactory extends SocketFactory
44 {
45 /** The proxy to use when creating new sockets. */
46 private final Proxy connProxy;
47
48 /**
49 * The default constructor.
50 */
51 public DefaultSocketFactory()
52 {
53 this(null);
54 }
55
56 /**
57 * A constructor for sockets with proxy support.
58 *
59 * @param proxy The Proxy to use when creating new Sockets.
60 * @since 3.2
61 */
62 public DefaultSocketFactory(Proxy proxy)
63 {
64 connProxy = proxy;
65 }
66
67 /**
68 * Creates an unconnected Socket.
69 *
70 * @return A new unconnected Socket.
71 * @exception IOException If an I/O error occurs while creating the Socket.
72 * @since 3.2
73 */
74 @Override
75 public Socket createSocket() throws IOException
76 {
77 if (connProxy != null)
78 {
79 return new Socket(connProxy);
80 }
81 return new Socket();
82 }
83
84 /***
85 * Creates a Socket connected to the given host and port.
86 * <p>
87 * @param host The hostname to connect to.
88 * @param port The port to connect to.
89 * @return A Socket connected to the given host and port.
90 * @exception UnknownHostException If the hostname cannot be resolved.
91 * @exception IOException If an I/O error occurs while creating the Socket.
92 ***/
93 @Override
94 public Socket createSocket(String host, int port)
95 throws UnknownHostException, IOException
96 {
97 if (connProxy != null)
98 {
99 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 * <p>
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 * <p>
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 * <p>
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 * <p>
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 * <p>
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 * <p>
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 }