    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 *      https://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 simply wrapping the java.net.Socket and java.net.ServerSocket constructors. It is the default
    032 * SocketFactory used by {@link org.apache.commons.net.SocketClient} implementations.
    033 *
    034 *
    035 * @see SocketFactory
    036 * @see SocketClient
    037 * @see SocketClient#setSocketFactory
    038 */
    039public class DefaultSocketFactory extends SocketFactory {
    040
    041    /** The proxy to use when creating new sockets. */
    042    private final Proxy connProxy;
    043
    044    /**
    045     * Constructs a new instance.
    046     */
    047    public DefaultSocketFactory() {
    048        this(null);
    049    }
    050
    051    /**
    052     * A constructor for sockets with proxy support.
    053     *
    054     * @param proxy The Proxy to use when creating new Sockets.
    055     * @since 3.2
    056     */
    057    public DefaultSocketFactory(final Proxy proxy) {
    058        connProxy = proxy;
    059    }
    060
    061    /**
    062     * Creates a ServerSocket bound to a specified port. A port of 0 will create the ServerSocket on a system-determined free port.
    063     *
    064     * @param port The port on which to listen, or 0 to use any free port.
    065     * @return A ServerSocket that will listen on a specified port.
    066     * @throws IOException If an I/O error occurs while creating the ServerSocket.
    067     */
    068    public ServerSocket createServerSocket(final int port) throws IOException {
    069        return new ServerSocket(port);
    070    }
    071
    072    /**
    073     * 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
    074     * a system-determined free port.
    075     *
    076     * @param port    The port on which to listen, or 0 to use any free port.
    077     * @param backlog The maximum length of the queue for incoming connections.
    078     * @return A ServerSocket that will listen on a specified port.
    079     * @throws IOException If an I/O error occurs while creating the ServerSocket.
    080     */
    081    public ServerSocket createServerSocket(final int port, final int backlog) throws IOException {
    082        return new ServerSocket(port, backlog);
    083    }
    084
    085    /**
    086     * 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
    087     * create the ServerSocket on a system-determined free port.
    088     *
    089     * @param port     The port on which to listen, or 0 to use any free port.
    090     * @param backlog  The maximum length of the queue for incoming connections.
    091     * @param bindAddr The local address to which the ServerSocket should bind.
    092     * @return A ServerSocket that will listen on a specified port.
    093     * @throws IOException If an I/O error occurs while creating the ServerSocket.
    094     */
    095    public ServerSocket createServerSocket(final int port, final int backlog, final InetAddress bindAddr) throws IOException {
    096        return new ServerSocket(port, backlog, bindAddr);
    097    }
    098
    099    /**
    100     * Creates an unconnected Socket.
    101     *
    102     * @return A new unconnected Socket.
    103     * @throws IOException If an I/O error occurs while creating the Socket.
    104     * @since 3.2
    105     */
    106    @Override
    107    public Socket createSocket() throws IOException {
    108        if (connProxy != null) {
    109            return new Socket(connProxy);
    110        }
    111        return new Socket();
    112    }
    113
    114    /**
    115     * Creates a Socket connected to the given host and port.
    116     *
    117     * @param address The address of the host to connect to.
    118     * @param port    The port to connect to.
    119     * @return A Socket connected to the given host and port.
    120     * @throws IOException If an I/O error occurs while creating the Socket.
    121     */
    122    @Override
    123    public Socket createSocket(final InetAddress address, final int port) throws IOException {
    124        if (connProxy != null) {
    125            final Socket s = new Socket(connProxy);
    126            s.connect(new InetSocketAddress(address, port));
    127            return s;
    128        }
    129        return new Socket(address, port);
    130    }
    131
    132    /**
    133     * Creates a Socket connected to the given host and port and originating from the specified local address and port.
    134     *
    135     * @param address   The address of the host to connect to.
    136     * @param port      The port to connect to.
    137     * @param localAddr The local address to use.
    138     * @param localPort The local port to use.
    139     * @return A Socket connected to the given host and port.
    140     * @throws IOException If an I/O error occurs while creating the Socket.
    141     */
    142    @Override
    143    public Socket createSocket(final InetAddress address, final int port, final InetAddress localAddr, final int localPort) throws IOException {
    144        if (connProxy != null) {
    145            final Socket s = new Socket(connProxy);
    146            s.bind(new InetSocketAddress(localAddr, localPort));
    147            s.connect(new InetSocketAddress(address, port));
    148            return s;
    149        }
    150        return new Socket(address, port, localAddr, localPort);
    151    }
    152
    153    /**
    154     * Creates a Socket connected to the given host and port.
    155     *
    156     * @param host The hostname to connect to.
    157     * @param port The port to connect to.
    158     * @return A Socket connected to the given host and port.
    159     * @throws UnknownHostException If the hostname cannot be resolved.
    160     * @throws IOException          If an I/O error occurs while creating the Socket.
    161     */
    162    @Override
    163    public Socket createSocket(final String host, final int port) throws UnknownHostException, IOException {
    164        if (connProxy != null) {
    165            final Socket s = new Socket(connProxy);
    166            s.connect(new InetSocketAddress(host, port));
    167            return s;
    168        }
    169        return new Socket(host, port);
    170    }
    171
    172    /**
    173     * Creates a Socket connected to the given host and port and originating from the specified local address and port.
    174     *
    175     * @param host      The hostname to connect to.
    176     * @param port      The port to connect to.
    177     * @param localAddr The local address to use.
    178     * @param localPort The local port to use.
    179     * @return A Socket connected to the given host and port.
    180     * @throws UnknownHostException If the hostname cannot be resolved.
    181     * @throws IOException          If an I/O error occurs while creating the Socket.
    182     */
    183    @Override
    184    public Socket createSocket(final String host, final int port, final InetAddress localAddr, final int localPort) throws UnknownHostException, IOException {
    185        if (connProxy != null) {
    186            final Socket s = new Socket(connProxy);
    187            s.bind(new InetSocketAddress(localAddr, localPort));
    188            s.connect(new InetSocketAddress(host, port));
    189            return s;
    190        }
    191        return new Socket(host, port, localAddr, localPort);
    192    }
    193}