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    
018    package org.apache.commons.net;
019    
020    import java.io.IOException;
021    import java.net.InetAddress;
022    import java.net.InetSocketAddress;
023    import java.net.Proxy;
024    import java.net.ServerSocket;
025    import java.net.Socket;
026    import java.net.UnknownHostException;
027    
028    import 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     * <p>
037     * <p>
038     * @see SocketFactory
039     * @see SocketClient
040     * @see SocketClient#setSocketFactory
041     ***/
042    
043    public 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         * <p>
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         * <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    }