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(final Proxy proxy)
063    {
064        connProxy = proxy;
065    }
066
067    /**
068     * Creates an unconnected Socket.
069     *
070     * @return A new unconnected Socket.
071     * @throws 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     * @throws UnknownHostException  If the hostname cannot be resolved.
091     * @throws IOException If an I/O error occurs while creating the Socket.
092     */
093    @Override
094    public Socket createSocket(final String host, final int port)
095    throws UnknownHostException, IOException
096    {
097        if (connProxy != null)
098        {
099            final 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     * @throws IOException If an I/O error occurs while creating the Socket.
113     */
114    @Override
115    public Socket createSocket(final InetAddress address, final int port)
116    throws IOException
117    {
118        if (connProxy != null)
119        {
120            final 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     * @throws UnknownHostException  If the hostname cannot be resolved.
137     * @throws IOException If an I/O error occurs while creating the Socket.
138     */
139    @Override
140    public Socket createSocket(final String host, final int port,
141                               final InetAddress localAddr, final int localPort)
142    throws UnknownHostException, IOException
143    {
144        if (connProxy != null)
145        {
146            final 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     * @throws IOException If an I/O error occurs while creating the Socket.
164     */
165    @Override
166    public Socket createSocket(final InetAddress address, final int port,
167                               final InetAddress localAddr, final int localPort)
168    throws IOException
169    {
170        if (connProxy != null)
171        {
172            final 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     * @throws IOException If an I/O error occurs while creating
187     *                        the ServerSocket.
188     */
189    public ServerSocket createServerSocket(final 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     * @throws IOException If an I/O error occurs while creating
203     *                        the ServerSocket.
204     */
205    public ServerSocket createServerSocket(final int port, final 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     * @throws IOException If an I/O error occurs while creating
222     *                        the ServerSocket.
223     */
224    public ServerSocket createServerSocket(final int port, final int backlog,
225                                           final InetAddress bindAddr)
226    throws IOException
227    {
228        return new ServerSocket(port, backlog, bindAddr);
229    }
230}