| 网站镜像:电信 网通 | 加入收藏 | 设为首页

一个用C#做的HTTP SERVER(从WINFORM搬来的)

  • 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;
    }
    }