C# 使用HttpListener创建简易Web服务器

转载 C# 使用HttpListener创建简易Web服务器 - PHP-张工 - 博客园

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace WebServer
{
    public class HttpServer
    {
        // HTTP服务
        private HttpListener listener = new HttpListener();
        private Thread ThreadListener = null;

        // web根目录
        private string WebPath = AppDomain.CurrentDomain.BaseDirectory + "web\\";

        // 自定义POST处理
        public delegate string EventDo(object sender, HttpListenerRequest request);
        public event EventDo OnEventDo;

        // 消息事件
        public delegate void EventInfo(object sender, string info);
        public event EventInfo OnEventInfo;

        // 最后错误信息
        public string LastErrorInfo = "";

        // 是否调试
        public bool IsDebug = false;

        public HttpServer()
        {
        }

        // 触发消息
        private void showInfo(string str)
        {
            OnEventInfo(this, str);
        }

        // Http服务器启动
        public bool start(int port)
        {
            try
            {
                if (listener.IsListening)
                {
                    return true;
                }

                // 使用本机IP地址监听
                IPAddress[] ipList = Dns.GetHostAddresses(Dns.GetHostName());

                listener.IgnoreWriteExceptions = true;
                listener.Prefixes.Clear();
                string host = "http://127.0.0.1:" + port.ToString() + "/";
                listener.Prefixes.Add(host);
                foreach (IPAddress ip in ipList)
                {
                    if (ip.AddressFamily.Equals(AddressFamily.InterNetwork))
                    {
                        host = "http://" + ip.ToString() + ":" + port.ToString() + "/";
                        if (!listener.Prefixes.Contains(host))
                        {
                            listener.Prefixes.Add(host);
                        }
                    }
                }

                listener.Start();
            }
            catch (Exception ex)
            {
                if (listener.IsListening)
                {
                    listener.Stop();
                }

                LastErrorInfo = "ERROR:HttpServer 启动失败:" + ex.Message;
                showInfo(LastErrorInfo);
                return false;
            }

            ThreadListener = new Thread(() =>
            {
                while (listener.IsListening)
                {
                    try
                    {
                        HttpListenerContext request = listener.GetContext();

                        // 从线程池从开一个新的线程去处理请求
                        ThreadPool.QueueUserWorkItem(processRequest, request);
                    }
                    catch
                    { }
                }
            });
            ThreadListener.Start();
            showInfo("HttpServer:" + port + " 已启动");

            return true;
        }

        // 停止
        public void stop()
        {
            if (listener.IsListening)
            {
                ThreadListener.Abort();
                listener.Stop();
                ThreadListener = null;
            }
        }

        // 是否在运行
        public bool isRun()
        {
            return listener.IsListening;
        }

        // 处理用户请求
        private void processRequest(object listenerContext)
        {
            var context = (HttpListenerContext)listenerContext;
            try
            {
                string filename = context.Request.Url.AbsolutePath.Trim('/');
                if (filename == "")
                {
                    filename = "index.html";
                }

                if (IsDebug)
                {
                    showInfo(context.Request.Url.ToString());
                }

                string[] ext_list = filename.Split('.');
                string ext = "";
                if (ext_list.Length > 1)
                {
                    ext = ext_list[ext_list.Length - 1];
                }

                string path = Path.Combine(WebPath, filename);
                byte[] msg = new byte[0];

                context.Response.StatusCode = (int)HttpStatusCode.OK;

                string expires = DateTime.Now.AddYears(10).ToString("r");

                // 浏览器缓存
                switch (ext)
                {
                    case "html":
                    case "htm":
                        context.Response.ContentType = "text/html";
                        break;
                    case "jpg":
                    case "jpeg":
                    case "jpe":
                        context.Response.ContentType = "image/jpeg";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "png":
                        context.Response.ContentType = "image/png";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "gif":
                        context.Response.ContentType = "image/gif";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "js":
                        context.Response.ContentType = "application/x-javascript";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "css":
                        context.Response.ContentType = "text/css";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "ico":
                        context.Response.ContentType = "application/x-ico";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                    case "txt":
                        context.Response.ContentType = "text/plain";
                        break;
                    case "do":
                        context.Response.AddHeader("Access-Control-Allow-Origin", "*");
                        context.Response.ContentType = "text/plain;charset=utf-8";
                        string strDo = OnEventDo(this, context.Request);
                        msg = Encoding.UTF8.GetBytes(strDo);
                        break;
                    default:
                        context.Response.ContentType = "";
                        context.Response.AddHeader("cache-control", "max-age=315360000, immutable");
                        context.Response.AddHeader("expires", expires);
                        break;
                }

                if (msg.Length == 0)
                {
                    if (!File.Exists(path))
                    {
                        context.Response.ContentType = "text/html";
                        context.Response.StatusCode = (int)HttpStatusCode.NotFound;
                        if (File.Exists(WebPath + "error.html"))
                        {
                            msg = File.ReadAllBytes(WebPath + "error.html");
                        }
                        else
                        {
                            msg = Encoding.Default.GetBytes("404");
                        }
                    }
                    else
                    {
                        msg = File.ReadAllBytes(path);
                    }
                }

                context.Response.ContentLength64 = msg.Length;
                using (Stream s = context.Response.OutputStream)
                {
                    s.Write(msg, 0, msg.Length);
                }

                msg = new byte[0];
                GC.Collect();
            }
            catch (Exception ex)
            {
                showInfo("ERROR:" + ex.Message);
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用C#创建简单的HttpListener服务器的示例代码: ```csharp using System; using System.Net; using System.Text; public class SimpleHttpServer { public static void Main(string[] args) { // 设置监听的地址和端口号 string url = "http://localhost:8080/"; // 创建HttpListener对象 HttpListener listener = new HttpListener(); // 添加要监听的地址 listener.Prefixes.Add(url); // 开始监听 listener.Start(); Console.WriteLine("Server is running..."); while (true) { // 等待客户端请求 HttpListenerContext context = listener.GetContext(); // 获取请求对象 HttpListenerRequest request = context.Request; // 获取请求的HTTP方法(GET, POST等) string httpMethod = request.HttpMethod; // 获取请求的URL string urlRequest = request.Url.ToString(); // 获取请求的内容 string requestBody = new System.IO.StreamReader(request.InputStream, request.ContentEncoding).ReadToEnd(); // 构建响应内容 string responseBody = "<html><body><h1>Hello, World!</h1></body></html>"; // 将响应内容转换为字节数组 byte[] buffer = Encoding.UTF8.GetBytes(responseBody); // 设置响应状态码 context.Response.StatusCode = 200; // 设置响应内容长度 context.Response.ContentLength64 = buffer.Length; // 发送响应内容 context.Response.OutputStream.Write(buffer, 0, buffer.Length); // 关闭响应 context.Response.OutputStream.Close(); } } } ``` 这个例子创建一个HttpListener对象,并设置要监听的地址和端口号。然后使用while循环等待客户端请求。当有客户端请求到达时,它获取请求对象,并从请求对象中获取HTTP方法,URL和内容。然后构建响应内容,并将其发送回客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值