zoukankan      html  css  js  c++  java
  • HttpListener 实现web服务端

    1.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Threading.Tasks;
    using System.IO;
    
    namespace HttpListen
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] arr = { "http://localhost:37090/", "http://zhihu.org.cn/a/" };
              //  SimpleListenerExample(arr);
               // test1(arr[1]);
                HttpServer httpServer;
                //if (args.GetLength(0) > 0)
                //{
                //httpServer = new MyHttpServer(Convert.ToInt16(args[0]));
                httpServer = new MyHttpServer(2345);
                //} else {
                //    httpServer = new MyHttpServer(8080);
                //}
                Thread thread = new Thread(new ThreadStart(httpServer.listen));
                thread.Start();
              
            }
    
            //方法1
            // This example requires the System and System.Net namespaces.
            public static void SimpleListenerExample(string[] prefixes)
            {
                if (!HttpListener.IsSupported)
                {
                    Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
                    return;
                }
                // URI prefixes are required,
                // for example "http://contoso.com:8080/index/".
                if (prefixes == null || prefixes.Length == 0)
                    throw new ArgumentException("prefixes");
            
                // Create a listener.
                HttpListener listener = new HttpListener();
                // Add the prefixes.
                foreach (string s in prefixes)
                {
                    listener.Prefixes.Add(s);
                }
                listener.Start();
                Console.WriteLine("Listening...");
    
                Task.Factory.StartNew(() =>
                {
    
                    // Note: The GetContext method blocks while waiting for a request. 
                    HttpListenerContext context = listener.GetContext();
                    HttpListenerRequest request = context.Request;
                    // Obtain a response object.
                    HttpListenerResponse response = context.Response;
                    // Construct a response.
                    string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
                    // Get a response stream and write the response to it.
                    response.ContentLength64 = buffer.Length;
                    System.IO.Stream output = response.OutputStream;
                    output.Write(buffer, 0, buffer.Length);
                    // You must close the output stream.
                    output.Close();
                    //  listener.Stop();
    
                });
    
              
                Console.WriteLine("ok");
                Console.ReadLine();
            }
    
            //方法2
            public static void test1(string url)
            {
                HttpListener httpListener = new HttpListener();
    
                httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
                httpListener.Prefixes.Add(url);
                Console.WriteLine("开始监听··········");
                httpListener.Start();
                new Thread(new ThreadStart(delegate
                {
                    while (true)
                    {
    
                        HttpListenerContext httpListenerContext = httpListener.GetContext();
                        httpListenerContext.Response.StatusCode = 200;
                        using (StreamWriter writer = new StreamWriter(httpListenerContext.Response.OutputStream))
                        {
                            writer.WriteLine("<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>测试服务器</title></head><body>");
                            writer.WriteLine("<div style="height:20px;color:blue;text-align:center;"><p> hello</p></div>");
                            writer.WriteLine("<ul>");
                            writer.WriteLine("</ul>");
                            writer.WriteLine("</body></html>");
    
                       
                        }
    
                    }
                })).Start();
    
            }
    
        }
    
    
    
    
      
    
    
    }
    

    方法3类文件:

    using System;
    using System.Collections;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    // offered to the public domain for any use with no restriction
    // and also with no warranty of any kind, please enjoy. - David Jeske. 
    
    // simple HTTP explanation
    // http://www.jmarshall.com/easy/http/
    
    namespace HttpListen
    {
    
        public class HttpProcessor
        {
            public TcpClient socket;
            public HttpServer srv;
    
            private StreamReader 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; // 10MB
    
            public HttpProcessor(TcpClient s, HttpServer srv)
            {
                this.socket = s;
                this.srv = srv;
            }
    
            public void process()
            {
                // bs = new BufferedStream(s.GetStream());
                inputStream = new StreamReader(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();
                // bs.Flush(); // flush any remaining output
                inputStream = null; outputStream = null; // bs = null;            
                socket.Close();
            }
    
            public void parseRequest()
            {
                String request = inputStream.ReadLine();
                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("starting: " + request);
            }
    
            public void readHeaders()
            {
                Console.WriteLine("readHeaders()");
                String line;
                while ((line = inputStream.ReadLine()) != 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 < line.Length) && (line[pos] == ' '))
                    {
                        pos++; // strip any spaces
                    }
    
                    string value = line.Substring(pos, line.Length - pos);
                    Console.WriteLine("header: {0}:{1}", name, value);
                    httpHeaders[name] = value;
                }
            }
    
            public void handleGETRequest()
            {
                srv.handleGETRequest(this);
            }
    
            public void handlePOSTRequest()
            {
                // this post data processing just reads everything into a memory stream.
                // this is fine for smallish things, but for large stuff we should really
                // hand an input stream to the request processor. However, the input stream 
                // we hand him needs to let him see the "end of the stream" at this content 
                // length, because otherwise he won't know when he's seen it all! 
    
                Console.WriteLine("get post data start");
                int content_len = 0;
                MemoryStream ms = new MemoryStream();
                if (this.httpHeaders.ContainsKey("Content-Length"))
                {
                    content_len = Convert.ToInt32(this.httpHeaders["Content-Length"]);
                    if (content_len > MAX_POST_SIZE)
                    {
                        throw new Exception(
                            String.Format("POST Content-Length({0}) too big for this simple server",
                              content_len));
                    }
                    byte[] buf = new byte[4096];
                    int to_read = content_len;
                    while (to_read > 0)
                    {
                        int numread = this.inputStream.BaseStream.Read(buf, 0, Math.Min(4096, to_read));
                        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.Write("HTTP/1.0 200 OK
    ");
                outputStream.Write("Content-Type: text/html
    ");
                outputStream.Write("Connection: close
    ");
                outputStream.Write("
    ");
            }
    
            public void writeFailure()
            {
                outputStream.Write("HTTP/1.0 404 File not found
    ");
                outputStream.Write("Connection: close
    ");
                outputStream.Write("
    ");
            }
        }
    
        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(IPAddress.Parse("127.0.0.1"), 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("<html><body><h1>test server</h1>");
                p.outputStream.WriteLine("Current Time: " + DateTime.Now.ToString());
                p.outputStream.WriteLine("url : {0}", p.http_url);
    
                p.outputStream.WriteLine("<form method=post action=/form>");
                p.outputStream.WriteLine("<input type=text name=foo value=foovalue>");
                p.outputStream.WriteLine("<input type=submit name=bar value=barvalue>");
                p.outputStream.WriteLine("</form>");
            }
    
            public override void handlePOSTRequest(HttpProcessor p, StreamReader inputData)
            {
                Console.WriteLine("POST request: {0}", p.http_url);
                string data = inputData.ReadToEnd();
    
                p.outputStream.WriteLine("<html><body><h1>test server</h1>");
                p.outputStream.WriteLine("<a href=/test>return</a><p>");
                p.outputStream.WriteLine("postbody: <pre>{0}</pre>", data);
            }
        }
    
      
    
    }
  • 相关阅读:
    Go 语言简介(下)— 特性
    Array.length vs Array.prototype.length
    【转】javascript Object使用Array的方法
    【转】大话程序猿眼里的高并发架构
    【转】The magic behind array length property
    【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript
    【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
    【转】大话程序猿眼里的高并发
    php通过token验证表单重复提交
    windows 杀进程软件
  • 原文地址:https://www.cnblogs.com/tiancai/p/4716127.html
Copyright © 2011-2022 走看看