> 文档中心 > C# http Web服务器响应post get 源码

C# http Web服务器响应post get 源码

 读卡器介绍:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.19.46885b43rjwDNT&id=22173428704https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-17663462238.19.46885b43rjwDNT&id=22173428704

using System;using System.Collections;using System.IO;using System.Net;using System.Net.Sockets;using System.Threading;namespace Bend.Util{    public class HttpProcessor    { public TcpClient socket; public HttpServer srv; private Stream inputStream; public StreamWriter outputStream; public String http_method; public String http_url; public String http_protocol_versionstring; public Hashtable httpHeaders = new Hashtable(); private static int MAX_POST_SIZE = 10 * 1024 * 1024;  public HttpProcessor(TcpClient s, HttpServer srv) {     this.socket = s;     this.srv = srv; } private string streamReadLine(Stream inputStream) {     int next_char;     string data = "";     while (true)     {  next_char = inputStream.ReadByte();  if (next_char == '\n') { break; }  if (next_char == '\r') { continue; }  if (next_char == -1) { Thread.Sleep(1); continue; };  data += Convert.ToChar(next_char);     }     return data; } public void process() {     inputStream = new BufferedStream(socket.GetStream());     outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));     try     {  parseRequest();  readHeaders();  if (http_method.Equals("GET"))  {      handleGETRequest();  }  else if (http_method.Equals("POST"))  {      handlePOSTRequest();  }     }     catch (Exception e)     {  Console.WriteLine("Exception: " + e.ToString());  writeFailure();     }     outputStream.Flush();     inputStream = null; outputStream = null; // bs = null;   socket.Close(); } public void parseRequest() {     String request = streamReadLine(inputStream);     string[] tokens = request.Split(' ');     if (tokens.Length != 3)     {  throw new Exception("invalid http request line");     }     http_method = tokens[0].ToUpper();     http_url = tokens[1];     http_protocol_versionstring = tokens[2];     Console.WriteLine("Current Time: " + DateTime.Now.ToString());     Console.WriteLine("starting: " + request); } public void readHeaders() {     Console.WriteLine("readHeaders()");     String line;     while ((line = streamReadLine(inputStream)) != null)     {  if (line.Equals(""))  {      Console.WriteLine("got headers");      return;  }  int separator = line.IndexOf(':');  if (separator == -1)  {      throw new Exception("invalid http header line: " + line);  }  String name = line.Substring(0, separator);  int pos = separator + 1;  while ((pos  MAX_POST_SIZE)  {      throw new Exception(   String.Format("POST Content-Length({0}) too big for this simple server",     content_len));  }  byte[] buf = new byte[BUF_SIZE];  int to_read = content_len;  while (to_read > 0)  {      Console.WriteLine("starting Read, to_read={0}", to_read);      int numread = this.inputStream.Read(buf, 0, Math.Min(BUF_SIZE, to_read));      Console.WriteLine("read finished, numread={0}", numread);      if (numread == 0)      {   if (to_read == 0)   {break;   }   else   {throw new Exception("client disconnected during post");   }      }      to_read -= numread;      ms.Write(buf, 0, numread);  }  ms.Seek(0, SeekOrigin.Begin);     }     Console.WriteLine("get post data end");     srv.handlePOSTRequest(this, new StreamReader(ms)); } public void writeSuccess() {     outputStream.WriteLine("HTTP/1.0 200 OK");     outputStream.WriteLine("Content-Type: text/html;charset=utf-8");     outputStream.WriteLine("Connection: close");     outputStream.WriteLine(""); } public void writeFailure() {     outputStream.WriteLine("HTTP/1.0 404 File not found");     outputStream.WriteLine("Connection: close");     outputStream.WriteLine(""); }    }    public abstract class HttpServer    { protected int port; TcpListener listener; bool is_active = true; public HttpServer(int port) {     this.port = port; } public void listen() {     listener = new TcpListener(port);     listener.Start();     while (is_active)     {  TcpClient s = listener.AcceptTcpClient();  HttpProcessor processor = new HttpProcessor(s, this);  Thread thread = new Thread(new ThreadStart(processor.process));  thread.Start();  Thread.Sleep(1);     } } public abstract void handleGETRequest(HttpProcessor p); public abstract void handlePOSTRequest(HttpProcessor p, StreamReader inputData);    }    public class MyHttpServer : HttpServer    { public MyHttpServer(int port)     : base(port) { } public override void handleGETRequest(HttpProcessor p) {     Console.WriteLine("request: {0}", p.http_url);     p.writeSuccess();     p.outputStream.WriteLine("

test server

"); p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString()); p.outputStream.WriteLine("url : {0}", p.http_url); p.outputStream.WriteLine(""); p.outputStream.WriteLine(""); p.outputStream.WriteLine(""); p.outputStream.WriteLine(""); } public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData) { Console.WriteLine("POST request: {0}", p.http_url); string data = inputData.ReadToEnd(); Console.WriteLine(data); p.outputStream.WriteLine("

test server

"); p.outputStream.WriteLine("return

"); p.outputStream.WriteLine("postbody:

{0}

", data); Console.WriteLine("\r\n"); } } public class TestMain { public static int Main(String[] args) { HttpServer httpServer; if (args.GetLength(0) > 0) { httpServer = new MyHttpServer(Convert.ToInt16(args[0])); } else { httpServer = new MyHttpServer(8080); } Thread thread = new Thread(new ThreadStart(httpServer.listen)); thread.Start(); return 0; } }}

  

程序运行效果: 

素描网