A command-line interface to a Web server : JSP Debug « JSP « Java






A command-line interface to a Web server


/**
*  Copyright (c) 2002 by Phil Hanna
*  All rights reserved.
*  
*  You may study, use, modify, and distribute this
*  software for any purpose provided that this
*  copyright notice appears in all copies.
*  
*  This software is provided without warranty
*  either expressed or implied.
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Mainline for running the Web client
*/
public class MainWebClient
{
   /**
   * Reads command line parameters, creates a new
   * <code>WebClient</code> object, then invokes it.
   */
   public static void main(String[] args)
      throws IOException
   {
      // Default values

      String host = "localhost";
      int port = 80;

      // Use values from command line, if specified

      for (int i = 0; i < args.length; i++) {
         String arg = args[i];
         if (arg.equals("-h") || arg.equals("-help")) {
            showUsage();
            return;
         }
         else
         if (arg.equals("-host") && ++i < args.length)
            host = args[i];
         else
         if (arg.equals("-port") && ++i < args.length)
            port = Integer.parseInt(args[i]);
      }

      // Create and start the Web client

      new WebClient(host, port).run();
   }

   /**
   * Displays the calling syntax
   */
   private static void showUsage()
   {
      String[] text = {
         "usage: java com.jspcr.debug.webclient.Main"
         + " [-host <hostName>]"
         + " [-port <portNumber>]",
      };
      for (int i = 0; i < text.length; i++)
         System.out.println(text[i]);
   }
}


/**
*  Copyright (c) 2002 by Phil Hanna
*  All rights reserved.
*  
*  You may study, use, modify, and distribute this
*  software for any purpose provided that this
*  copyright notice appears in all copies.
*  
*  This software is provided without warranty
*  either expressed or implied.
*/

/**
* A command-line interface to a Web server
*/
class WebClient
{
   // Instance variables

   private String host;
   private int port;

   /**
   * Creates a new Web client
   * @param host the HTTP server
   * @param port the server port number
   */
   public WebClient(String host, int port)
   {
      this.host = host;
      this.port = port;
   }

   /**
   * Runs the Web client
   * @throws IOException if a socket error occurs
   */
   public void run() throws IOException
   {
      int contentLength = 0;

      // Open a socket to the Web host

      Socket socket = new Socket(host, port);

      // Set up to read input from the user
      // and echo it to Web host

      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      PrintWriter out =
         new PrintWriter(socket.getOutputStream(), true);

      // The first line is the HTTP request
      // e.g., "GET /path HTTP/1.0"

      String line = in.readLine();
      out.println(line);

      // Read and echo any other headers, stopping
      // when a blank line is encountered.

      while ((line = in.readLine()) != null) {

         line = line.trim();
         out.println(line);
         if (line.equals(""))
            break;

         // Check for a Content-Length header

         Pattern p = Pattern.compile
            ("^\\s*([^:]+):\\s+(.*\\S)\\s*$");
         Matcher m = p.matcher(line);
         if (m.matches()) {
            String name = m.group(1);
            String value = m.group(2);
            if (name.equalsIgnoreCase("Content-Length"))
               contentLength = Integer.parseInt(value);
         }
      }

      // If a non-zero content length header was used,
      // read and echo that many bytes to the Web host.

      if (contentLength > 0) {
         for (int i = 0; i < contentLength; i++)
            out.print((char) in.read());
         out.flush();
      }

      // The server is now working on the request.
      // Read its output and dump to stdout

      in = new BufferedReader(
           new InputStreamReader(socket.getInputStream()));

      out = new PrintWriter(System.out);

      for (;;) {
         line = in.readLine();
         if (line == null)
            break;
         out.println(line);
      }
      
      // Close files

      in.close();
      out.close();
      socket.close();
   }
}

           
       








Related examples in the same category

1.HTTP Echo For testing
2.Mainline for the HTTP tracer tool