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

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
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 http server {

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

  protected int port;

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

  public http server() : this(80) {
  }

  public http server(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) {
     http server http server;
    if(args.GetLength(0) > 0) {
       http server = new http server(args[0].ToUInt16());
    } else {
       http server = new http server();
    }
    Thread thread = new Thread(new ThreadStart( http server.listen));
    thread.Start();
    return 0;
  }
}




http://www.dooba.cn/wangzhanyunying/wangzhanyouhua/" title="seo,搜索引擎优化">seover="window.status='正文-- http://www.66of.com" target=_blank>一个用C# http://www.66of.com" target=_blank>实现的 http://www.66of.com" target=_blank>简单 http server(转)';return true">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值