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

一个用C#实现的简单http server (转)[@more@]

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


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-989465/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-989465/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值