using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; namespace RyWeb { /// /// Http服务器类 /// public class HttpServer { /// /// /// /// /// public delegate void HttpRequestHandler(object sender, HttpRequest e); /// /// 当收到Get事件时激发 /// [Description("当收到Get事件时激发")] public event HttpRequestHandler OnHandleGETRequest; /// /// 当收到Post事件时激发 /// [Description("当收到Post事件时激发")] public event HttpRequestHandler OnHandlePOSTRequest; private HttpListener listener; private Thread httpThread; private volatile bool stopped = false; /// /// 监听的主机,默认是localhost /// public string ListenerHost { get; set; } = "localhost"; private int port = 19955; /// /// 最后一次错误信息 /// public string ErrorMessage { get;internal set; } = ""; /// /// 在此端口建立Http服务类 /// /// 端口号 public HttpServer(int port) { isrunning = false; stopped = false; try { listener = new HttpListener(); this.port= port; listener.Prefixes.Add("http://"+ ListenerHost + ":" + port + "/"); //listener.Prefixes.Add(HTTPS_PREFIX + HTTPS_PORT + "/"); listener.Start(); httpThread = new Thread(new ThreadStart(Run)); httpThread.Start(); isrunning = true; } catch(Exception ex) { ErrorMessage = ex.Message; } } private bool isrunning = false; /// /// /// /// public bool IsRunning() { return isrunning; } /// /// 开始服务 /// public void Start() { isrunning = false; stopped = false; try { if (listener == null || !listener.IsListening) { listener = new HttpListener(); listener.Prefixes.Add("http://"+ ListenerHost + ":" + port + "/"); //listener.Prefixes.Add(HTTPS_PREFIX + HTTPS_PORT + "/"); listener.Start(); } if (httpThread == null || httpThread.ThreadState != ThreadState.Running) { httpThread = new Thread(new ThreadStart(Run)); httpThread.Start(); } isrunning = true; } catch(Exception ex) { ErrorMessage = ex.Message; } } /// /// 退出服务 /// public void Exit() { stopped = true; try { if (listener != null) { listener.Stop(); listener.Close(); } if (httpThread != null) { httpThread.Interrupt(); } listener = null; httpThread = null; } catch (Exception ex) { ErrorMessage = ex.Message; } isrunning = false; } /// /// /// ~HttpServer() { Exit(); } private void Run() { while (!stopped) { try { var r = listener.BeginGetContext(new AsyncCallback(RequestHandler), listener); r.AsyncWaitHandle.WaitOne(); r.AsyncWaitHandle.Close(); } catch (ThreadInterruptedException e1) { ErrorMessage = e1.Message; } catch (HttpListenerException e2) { ErrorMessage = e2.Message; } } } private void RequestHandler(IAsyncResult r) { try { _RequestHandler(r); } catch (Exception e) { ErrorMessage = e.Message; } } private void _RequestHandler(IAsyncResult r) { if (stopped) return; var l = (HttpListener)r.AsyncState; var ctx = l.EndGetContext(r); var req = ctx.Request; var resp = ctx.Response; var html = ""; if(req.HttpMethod=="GET") { HttpRequest e = new HttpRequest(); e.Url = req.Url; e.UrlReferrer = req.UrlReferrer; OnHandleGETRequest?.Invoke(this,e); resp.StatusCode = (int)e.StatusCode; html = e.ReturnHtml; } else if(req.HttpMethod=="POST") { HttpRequest e = new HttpRequest { Url = req.Url, UrlReferrer = req.UrlReferrer }; var sr = new StreamReader(req.InputStream, Encoding.GetEncoding("GB2312")); e.PostData= sr.ReadToEnd(); sr.Close(); OnHandlePOSTRequest?.Invoke(this, e); resp.StatusCode = (int)e.StatusCode; html = e.ReturnHtml; } var buffer = Encoding.UTF8.GetBytes(html); resp.ContentLength64 = buffer.Length; resp.OutputStream.Write(buffer, 0, buffer.Length); var outs = resp.OutputStream; outs.Close(); resp.Close(); } } /// /// /// public class HttpRequest { /// /// /// public Uri Url { get; internal set; } /// /// /// public string PostData { get; internal set; } = ""; /// /// /// public Uri UrlReferrer { get; internal set; } /// /// /// public string ReturnHtml { get; set; } = ""; /// /// /// public HttpStatusCode StatusCode { get; set; } = HttpStatusCode.OK; } }