alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

// $Header: /home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/proxy/Daemon.java,v 1.12 2004/02/18 22:50:41 sebb Exp $
/*
 * Copyright 2001-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
*/

package org.apache.jmeter.protocol.http.proxy;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;

/**
 * Web daemon thread.  Creates main socket on port 8080 and listens on it
 * forever.  For each client request, creates a proxy thread to handle the
 * request.
 *
 * @author     default
 * Created    June 29, 2001
 * @version $Revision: 1.12 $ Last updated: $Date: 2004/02/18 22:50:41 $
 */
public class Daemon extends Thread
{
    /** Logging */
    private static transient Logger log = LoggingManager.getLoggerForClass();

    /** The default port to listen on. */
    private static final int DEFAULT_DAEMON_PORT = 8080;

    /** The maximum allowed port to listen on. */
    private static final int MAX_DAEMON_PORT = 65535;

    /**
     * The time (in milliseconds) to wait when accepting a client connection.
     * The accept will be retried until the Daemon is told to stop.  So this
     * interval is the longest time that the Daemon will have to wait after
     * being told to stop.
     */
    private static final int ACCEPT_TIMEOUT = 1000;

    /** The port to listen on. */
    private int daemonPort;

    /** True if the Daemon is currently running. */
    private boolean running;

    /** The target which will receive the generated JMeter test components. */
    private ProxyControl target;

    /**
     * The proxy class which will be used to handle individual requests.  This
     * class must be the {@link Proxy} class or a subclass.
     */
    private Class proxyClass = Proxy.class;


    /**
     * Default constructor.
     */
    public Daemon()
    {
        super("HTTP Proxy Daemon");
    }

    /**
     * Create a new Daemon with the specified port and target.
     *
     * @param port   the port to listen on.
     * @param target the target which will receive the generated JMeter test
     *               components.
     */
    public Daemon(int port, ProxyControl target)
    {
        this();
        this.target = target;
        configureProxy(port);
    }

    /**
     * Create a new Daemon with the specified port and target, using the
     * specified class to handle individual requests.
     *
     * @param port   the port to listen on.
     * @param target the target which will receive the generated JMeter test
     *               components.
     * @param proxyClass the proxy class to use to handle individual requests.
     *                   This class must be the {@link Proxy} class or a
     *                   subclass.
     */
    public Daemon(int port, ProxyControl target, Class proxyClass)
    {
        this(port, target);
        this.proxyClass = proxyClass;
    }

    /**
     * Configure the Daemon to listen on the specified port.
     * @param daemonPort the port to listen on
     */
    public void configureProxy(int daemonPort)
    {
        this.daemonPort = daemonPort;
        log.info("Proxy: OK");
    }

    /**
     * Main method which will start the Proxy daemon on the specified port (or
     * the default port if no port is specified).
     *
     * @param args the command-line arguments
     */
    public static void main(String args[])
    {
        if (args.length > 1)
        {
            System.err.println ("Usage: Daemon [daemon port]");
            log.info("Usage: Daemon [daemon port]");
            return;
        }

        int daemonPort = DEFAULT_DAEMON_PORT;
        if (args.length > 0)
        {
            try
            {
                daemonPort = Integer.parseInt(args[0]);
            }
            catch (NumberFormatException e)
            {
                System.err.println ("Invalid daemon port: " + e);
                log.error("Invalid daemon port", e);
                return;
            }
            if (daemonPort <= 0 || daemonPort > MAX_DAEMON_PORT)
            {
                System.err.println ("Invalid daemon port");
                log.error("Invalid daemon port");
                return;
            }
        }

        Daemon demon = new Daemon();
        demon.configureProxy(daemonPort);
        demon.start();
    }

    /**
     * Listen on the daemon port and handle incoming requests.  This method will
     * not exit until {@link #stopServer()} is called or an error occurs.
     */
    public void run()
    {
        running = true;
        ServerSocket mainSocket = null;

        try
        {
            log.info("Creating Daemon Socket... on port " + daemonPort);
            mainSocket = new ServerSocket(daemonPort);
            mainSocket.setSoTimeout(ACCEPT_TIMEOUT);
            log.info("Proxy up and running!");

            while (running)
            {
                try
                {
                    // Listen on main socket
                    Socket clientSocket = mainSocket.accept();
                    if (running)
                    {
                        // Pass request to new proxy thread
                        Proxy thd = (Proxy) proxyClass.newInstance();
                        thd.configure(clientSocket, target);
                        thd.start();
                    }
                    else
                    {
                        // The socket was accepted after we were told to stop.
                        try
                        {
                            clientSocket.close();
                        }
                        catch (IOException e)
                        {
                            // Ignore
                        }
                    }
                }
                catch (InterruptedIOException e)
                {
                    // Timeout occurred.  Ignore, and keep looping until we're
                    // told to stop running.
                }
            }
            log.info("Proxy Server stopped");
        }
        catch (Exception e)
        {
            log.warn("Proxy Server stopped", e);
        }
        finally
        {
            try
            {
                if (mainSocket != null) mainSocket.close();
            }
            catch (Exception exc)
            {
            }
        }
    }

    /**
     * Stop the proxy daemon.  The daemon may not stop immediately.
     *
     * see #ACCEPT_TIMEOUT
     */
    public void stopServer()
    {
        running = false;
    }
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.