一个用C#实现的简单http server

来源:互联网 发布:饭卡充值软件下载 编辑:程序博客网 时间:2024/05/17 18:13
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;
  }
}

 
原创粉丝点击