当前位置: 首页 > news >正文

HTTP listener 的封装---HttpListenerEx

HttpListener用途:监听HTTP请求。


示例:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Threading;


namespace HTTPListenerDemo
{
    public class HttpListenerEx
    {


        #region Members


        /// <summary>
        /// 当前监听HTTP请求的对象
        /// </summary>
        private HttpListener currentListener;


        /// <summary>
        /// 停止监听所有请求
        /// </summary>
        private bool StopAll = false;


        #endregion


        #region Constructor


        /// <summary>
        /// 初始化时指定一个要监听的网络地址,以'/'结尾
        /// 例如:"http://contoso.com:8080/index/".
        /// </summary>
        /// <param name="url">要监听的网络地址</param>
        public HttpListenerEx(string url)
        {
            this.currentListener = new HttpListener();
            this.currentListener.Prefixes.Add(url);
        }


        /// <summary>
        /// 初始化时指定多个地址,同时监听,地址以'/'结束
        /// 例如:"http://contoso.com:8080/index/".
        /// </summary>
        /// <param name="urls">要监听的网络地址集合</param>
        public HttpListenerEx(string[] urls)
        {
            this.currentListener = new HttpListener();
            foreach (string s in urls)
            {
                this.currentListener.Prefixes.Add(s);
            }
        }


        #endregion


        #region Methods


        /// <summary>
        /// 监听HTTP请求(只处理第一次的请求,处理完之后就结束了)
        /// </summary>
       /// <param name="OnGetRequestStr">将接收到的请求字符串交给OnGetRequestStr处理</param>
        public void ListenForOnce(string responseStr, Action<string> OnRequestGet)
        {
            if (!HttpListener.IsSupported)
            {
                // Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
                return;
            }


            开始监听
            this.currentListener.Start();


            处理请求
            HandleRequest(responseStr, OnRequestGet);


            停止监听
            this.currentListener.Stop();
        }


        /// <summary>
        /// 监听HTTP请求,监听到之后,立刻返给客户端一个字符串
        /// </summary>
       /// <param name="OnGetRequestStr">将接收到的请求字符串交给OnGetRequestStr处理</param>
        public void StartListen(string responseStr, Action<string> OnGetRequest)
        {
            if (!HttpListener.IsSupported)
            {
                // Console.WriteLine("Windows XP SP2 or Server 2003 is required to use the HttpListener class.");
                return;
            }
            开始监听
            this.currentListener.Start();


            处理请求
            while (!StopAll)
            {
                HandleRequest(responseStr, OnGetRequest);
            }
        }


        /// <summary>
        /// 结束监听
        /// </summary>
        public void EndListen()
        {
            StopAll = true;
            this.currentListener.Abort();
        }


        #endregion


        #region Private Methods


        /// <summary>
        /// 处理请求
        /// </summary>
        /// <param name="OnGetRequestStr">将接收到的请求字符串交给OnGetRequestStr处理</param>
        private void HandleRequest(string responseStr, Action<string> OnGetRequestStr)
        {
            HttpListenerContext context = this.currentListener.GetContext();
            HttpListenerRequest request = context.Request;
            // Obtain a response object.
            HttpListenerResponse response = context.Response;
            StreamReader sr = new StreamReader(request.InputStream);
            OnGetRequestStr(sr.ReadToEnd());
            // Construct a response.
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseStr);
            // 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();
        }


        #endregion
    }
}


相关文章:

  • C#把外部文件拖入PictureBox中
  • C# 中 字符串和byte数组的转换
  • 《重构——改善既有代码的设计》
  • 二分查找法 C#实现
  • 清华申请退学博士作品:完全用Linux工作
  • C# 压缩和解压缩(Gzip和Zip的方式)
  • Jsp联接Access数据库文件的方法
  • 中国教育“绞肉机”
  • 在指定范围内 生成随机序列算法(可用于洗牌算法)
  • 不用‘/’ 实现除法运算
  • HTML5中的 querySelector
  • js中json的序列化和反序列化
  • 娱乐:输出π的前781位
  • Windows编程模型与API调用示例
  • UltraWebGrid禁止编辑单元格
  • C++类的相互关联
  • JavaScript实现分页效果
  • Linux链接文件
  • node.js
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Redis的resp协议
  • 初识 beanstalkd
  • 关于extract.autodesk.io的一些说明
  • 你不可错过的前端面试题(一)
  • 深入浅出webpack学习(1)--核心概念
  • 数组大概知多少
  • 王永庆:技术创新改变教育未来
  • 系统认识JavaScript正则表达式
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • (4.10~4.16)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (安卓)跳转应用市场APP详情页的方式
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十五)使用Nexus创建Maven私服
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)SpringBoot3---尚硅谷总结
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • ./configure、make、make install 命令
  • .bat批处理出现中文乱码的情况
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /dev下添加设备节点的方法步骤(通过device_create)
  • [1204 寻找子串位置] 解题报告
  • [17]JAVAEE-HTTP协议
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [ARM]ldr 和 adr 伪指令的区别
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [C# 网络编程系列]专题六:UDP编程
  • [EFI]Acer Aspire A515-54g电脑 Hackintosh 黑苹果efi引导文件
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [HNOI2010]BUS 公交线路
  • [HNOI2018]排列
  • [java基础揉碎]关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符运算符的优先级