• c#使用HttpListener监听HTTP请求


    HttpListener提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。通过它可以很容易的提供一些Http服务,而无需启动IIS这类大型服务程序。

    注意:该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的计算机上可用。

    使用Http服务一般步骤如下:

    1. 创建一个HTTP侦听器对象并初始化
    2. 添加需要监听的URI 前缀
    3. 开始侦听来自客户端的请求
    4. 处理客户端的Http请求
    5. 关闭HTTP侦听器

     其中3,4两步可以循环处理,以提供多客户多次请求的服务。

    第一步:创建一个HTTP侦听器对象

    创建HTTP侦听器对象只需要新建一个HttpListener对象即可。

    HttpListener listener = new HttpListener();

    第二步:初始化

    添加需要监听的URL范围至listener.Prefixes中,可以通过如下函数实现:
    listener.Prefixes.Add(prefix) //prefix必须以'/'结尾
    调用listener.Start()实现端口的绑定,并开始监听客户端的需求。
     

    第三步:接受HTTP请求

    在.net2.0中,通过HttpListenerContext对象提供对HttpListener类使用的请求和响应对象的访问。

    获取HttpListenerContext的最简单方式如下:

    HttpListenerContext context = listener.GetContext();

    该方法将阻塞调用函数至接收到一个客户端请求为止,如果要提高响应速度,

    可使用异步方法listener.BeginGetContext()来实现HttpListenerContext对象的获取。 

    第四步:处理HTTP请求

    获取HttpListenerContext后,可通过Request属性获取表示客户端请求的对象,通过Response属性取表示 HttpListener 将要发送到客户端的响应的对象。

    HttpListenerRequest request = context.Request;
    HttpListenerResponse response = context.Response;

    这里的HttpListenerRequest对象和HttpListenerResponse对象和Asp中的Request和Response的使用方式类似,这里就不多说了,具体的使用可以参看下面的例子。

    第五步:关闭HTTP侦听器

    通过调用listener.Stop()函数即可关闭侦听器,并释放相关资源 

    根据网上的资源,编写的简单测试代码,以供大家一起学习,源码在最下面可下载

    基本变量
     private HttpListener _listener;
    控制监听HTTP请求
            #region 控制监听
    
            //开启监听
            private void btnStart_Click(object sender, EventArgs e)
            {
                //获取监听的多个地址
                string ipAddress1 = txtIPAddress1.Text.Trim();
                string ipAddress2 = txtIPAddress2.Text.Trim();
    
                // 注意前缀必须以 / 正斜杠结尾
                string[] prefixes = new string[] { ipAddress1, ipAddress2 };
                HttpListenerServer httpListenerServer = new HttpListenerServer();
                try
                {
                    // 检查系统是否支持
                    if (!HttpListener.IsSupported)
                    {
                        throw new ArgumentException("使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
                    }
                    else
                    { 
                        if (prefixes == null || prefixes.Length == 0)
                            throw new ArgumentException("缺少地址参数:prefixes");
                        else
                        {
                            //启动监听 // 创建监听器.
                            _listener = new HttpListener();
                            httpListenerServer.Start(_listener, prefixes);
                            lblListen.Text = "启用HttpListener监听成功!"; 
                        }
                    }
                }
                catch (Exception ex)
                { 
                    MessageBox.Show(ex.Message);
                } 
            }
    
            //关闭监听
            private void btnClose_Click(object sender, EventArgs e)
            {
                if (_listener != null)
                {
                    _listener.Close();
                    lblListen.Text = "停止HttpListener监听成功!"; 
                }
            }
    
            #endregion
    View Code
    处理HTTP请求数据
    using Newtonsoft.Json.Linq;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks; 
    
    namespace WFHttpServer
    {
        /// <summary>
        ///  通过HttpListener实现简单的http服务器
        /// </summary>
        public class HttpListenerServer
        {
            /// <summary>
            /// 启动监听
            /// </summary>
            /// <param name="prefixes">监听的多个地址</param>
            public void Start(HttpListener _listener, string[] prefixes)
            { 
                // 增加监听的前缀
                foreach (string s in prefixes)
                    _listener.Prefixes.Add(s);
    
                _listener.Start(); //开始监听
                _listener.BeginGetContext(GetContextCallBack, _listener);
            }
    
            private void GetContextCallBack(IAsyncResult ar)
            {
                try
                {
                    HttpListener _listener = ar.AsyncState as HttpListener;
                    if (_listener.IsListening)
                    {
                        HttpListenerContext context = _listener.EndGetContext(ar);
                        _listener.BeginGetContext(new AsyncCallback(GetContextCallBack), _listener);
    
                        #region 解析Request请求
    
                        HttpListenerRequest request = context.Request;
                        string content = "";
                        switch (request.HttpMethod)
                        {
                            case "POST":
                                {
                                    Stream stream = context.Request.InputStream;
                                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                                    content = reader.ReadToEnd();
    
                                    //模拟接受的数据:将接收的字符串内容进行json反序列号为对象
                                    TestValue tv = JsonConvert.DeserializeObject<TestValue>(content); 
                                    //根据需求做相应操作
                                }
                                break;
                            case "GET":
                                {
                                    var data = request.QueryString;
                                }
                                break;
                        }
    
                        #endregion
    
                        #region 构造Response响应
    
                        HttpListenerResponse response = context.Response; 
                        response.StatusCode = (int)HttpStatusCode.OK;
                        response.ContentType = "application/json;charset=UTF-8";
                        response.ContentEncoding = Encoding.UTF8;
                        response.AppendHeader("Content-Type", "application/json;charset=UTF-8");
    
                        //模拟返回的数据:Json格式
                        var abcOject = new
                        {
                            code = "200",
                            description = "success",
                            data = "time=" + DateTime.Now
                        };
                        string responseString = JsonConvert.SerializeObject(abcOject,
                            new JsonSerializerSettings()
                            {
                                StringEscapeHandling = StringEscapeHandling.EscapeNonAscii
                            });
    
                        using (StreamWriter writer = new StreamWriter(response.OutputStream, Encoding.UTF8))
                        {
                            writer.Write(responseString);
                            writer.Close();
                            response.Close();
                        }
    
                        #endregion
    
                    }
                }
                catch (Exception ex)
                {
                    throw new ArgumentException(ex.Message);
                }
            }
        }
    
    
        //用于json反序列化获取的测试实体类
        public class TestValue
        {
            public int id { get; set; }
            public string name { get; set; }
        }
    
    
    }
    View Code

    运行效果

    1、启动服务

    2、postman测试

    第一个地址测试

    第二个地址测试

    源码下载:源码

    本文引自:

    https://blog.csdn.net/qq_36702996/article/details/78892380

    https://blog.csdn.net/lordwish/article/details/86615077

    https://www.cnblogs.com/wlitsoft/archive/2012/04/25/2469524.html

  • 相关阅读:
    HTTP-Headers-And-Tricks
    Burp减少干扰
    HTTP 请求低位三连的解决办法
    apk 脱壳 报错:Failed to spawn: unable to access zygote64 while preparing for app launch; try disablin...
    mysql 如何分批 读取数据
    记录一次问题排查
    navicat打开几秒后就自动关闭
    1013 Battle Over Cities (25 分)
    1012 The Best Rank (25 分)
    1011 World Cup Betting (20 分)
  • 原文地址:https://www.cnblogs.com/ggll611928/p/15726839.html
Copyright © 2020-2023  润新知