主页 > 编程资料 > C# >
发布时间:2015-09-26 作者:网络 阅读:217次

http.cs 
----------------------------  
using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

class HttpProcessor {

  private Socket s;
  private BufferedStream bs;
  private StreamReader sr;
  private StreamWriter sw;
  private String method;
  private String url;
  private String protocol;
  private Hashtable hashTable;

  public HttpProcessor(Socket s) {
    this.s = s;
    hashTable = new Hashtable(,',',');
  }

  public void process() {
    NetworkStream ns = new NetworkStream(s, FileAccess.ReadWrite,',',');
    bs = new BufferedStream(ns,',',');
    sr = new StreamReader(bs,',',');
    sw = new StreamWriter(bs,',',');
    parseRequest(,',',');
    readHeaders(,',',');
    writeURL(,',',');
    s.Shutdown(SocketShutdown.SdBoth,',',');
    ns.Close(,',',');
  }

  public void parseRequest() {
    String request = sr.ReadLine(,',',');
    string[] tokens = request.Split(new char[]{' '},',',');
    method = tokens[0];
    url = tokens[1];
    protocol = tokens[2];
  }

  public void readHeaders() {
    String line;
    while((line = sr.ReadLine()) != null && line != "") {
      string[] tokens = line.Split(new char[]{':'},',',');
      String name = tokens[0];
      String value = "";
      for(int i = 1; i < tokens.Length; i++) {
        value += tokens[i];
        if(i < tokens.Length - 1) tokens[i] += ":";
      }
      hashTable[name] = value;
    }
  }

  public void writeURL() {
    try {
      FileStream fs = new FileStream(url.Substring(1), FileMode.Open, FileAccess.Read,',',');
      writeSuccess(,',',');
      BufferedStream bs2 = new BufferedStream(fs,',',');
      byte[] bytes = new byte[4096];
      int read;
      while((read = bs2.Read(bytes, 0, bytes.Length)) != 0) {
        bs.Write(bytes, 0, read,',',');
      }
      bs2.Close(,',',');
    } catch(FileNotFoundException) {
      writeFailure(,',',');
      sw.WriteLine("File not found: " + url,',',');
    }
    sw.Flush(,',',');
  }

  public void writeSuccess() {
    sw.WriteLine("HTTP/1.0 200 OK",',',');
    sw.WriteLine("Connection: close",',',');
    sw.WriteLine(,',',');
  }

  public void writeFailure() {
    sw.WriteLine("HTTP/1.0 404 File not found",',',');
    sw.WriteLine("Connection: close",',',');
    sw.WriteLine(,',',');
  }
}

public class HttpServer {

  // ============================================================
  // Data

  protected int port;

  // ============================================================
  // Constructor

  public HttpServer() : this(80) {
  }

  public HttpServer(int port) {
    this.port = port;
  }

  // ============================================================
  // Listener

  public void listen() {
    Socket listener = new Socket(0, SocketType.SockStream, ProtocolType.ProtTCP,',',');
    IPAddress ipaddress = new IPAddress("127.0.0.1",',',');
    IPEndPoint endpoint = new IPEndPoint(ipaddress, port,',',');
    listener.Bind(endpoint,',',');
    listener.Blocking = true;
    listener.Listen(-1,',',');
    while(true) {
      Socket s = listener.Accept(,',',');
      HttpProcessor processor = new HttpProcessor(s,',',');
      Thread thread = new Thread(new ThreadStart(processor.process),',',');
      thread.Start(,',',');
    }
  }

  // ============================================================
  // Main

  public static int Main(String[] args) {
    HttpServer httpServer;
    if(args.GetLength(0) > 0) {
      httpServer = new HttpServer(args[0].ToUInt16(),',',');
    } else {
      httpServer = new HttpServer(,',',');
    }
    Thread thread = new Thread(new ThreadStart(httpServer.listen),',',');
    thread.Start(,',',');
    return 0;
  }
}

 

关键字词: