www.pudn.com > jnp-src.rar > Httpd.java


/*
 * Java Network Programming, Second Edition
 * Merlin Hughes, Michael Shoffner, Derek Hamner
 * Manning Publications Company; ISBN 188477749X
 *
 * http://nitric.com/jnp/
 *
 * Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner;
 * all rights reserved; see license.txt for details.
 */

import java.io.*; 
import java.net.*; 
import java.util.*; 
 
public class Httpd implements Runnable { 
  protected Socket client; 
 
  public Httpd (Socket client) { 
    this.client = client; 
  } 
 
  public void run () { 
    try { 
      InputStream in = client.getInputStream (); 
      HttpInputStream httpIn = new HttpInputStream (in); 
      HttpProcessor processor = getProcessor (httpIn); 
      OutputStream out = client.getOutputStream (); 
      HttpOutputStream httpOut = new HttpOutputStream (out, httpIn); 
      processor.processRequest (httpOut); 
      httpOut.flush (); 
    } catch (IOException ex) { 
      ex.printStackTrace (); 
    } finally { 
      try { 
        client.close (); 
      } catch (IOException ignored) { 
      } 
    } 
  } 
   
  protected HttpProcessor getProcessor (HttpInputStream httpIn) { 
    try { 
      httpIn.readRequest (); 
      if (httpIn.getPath ().startsWith (HTTP.CGI_BIN)) 
        return new HttpCGI (httpIn, client.getInetAddress ()); 
      else if (httpIn.getPath ().startsWith (HTTP.CLASS_BIN)) 
        return new HttpClass (httpIn); 
      else 
        return new HttpFile (httpIn); 
    } catch (HttpException ex) { 
      return ex; 
    } catch (Exception ex) { 
      StringWriter trace = new StringWriter (); 
      ex.printStackTrace (new PrintWriter (trace, true)); 
      return new HttpException (HTTP.STATUS_INTERNAL_ERROR, 
                                "
" + trace + "
"); } } public static void main (String[] args) throws IOException { ServerSocket server = new ServerSocket (HTTP.PORT); while (true) { Socket client = server.accept (); Httpd httpd = new Httpd (client); ReThread reThread = new ReThread (httpd); reThread.start (); } } }