架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 32830|回复: 3

[资料] c# http用HttpListener监听线程

[复制链接]
发表于 2016-7-12 13:03:46 | 显示全部楼层 |阅读模式
  1. using AndroidPush.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Text;
  7. using System.Threading;

  8. namespace AndroidPush.WindowsService
  9. {
  10.     public class HttpService
  11.     {
  12.         private HttpListener listeren = new HttpListener();

  13.         /// <summary>
  14.         /// 初始化
  15.         /// </summary>
  16.         public void Init()
  17.         {
  18.             try
  19.             {
  20.                 //指定身份验证 Anonymous匿名访问
  21.                 listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  22.                 //创建IP地址
  23.                 IPAddress address = IPAddress.Parse(Config._ip);
  24.                 listeren.Prefixes.Add("http://" + address + ":" + Config._porthttp + "/");
  25.                 listeren.Start();
  26.                 Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
  27.                 threadlistener.IsBackground = true;
  28.                 threadlistener.Start();
  29.                 LogHelper.WriteLog("HTTP success ip:" + Config._ip + "_port:" + Config._porthttp);
  30.             }
  31.             catch (Exception ex)
  32.             {
  33.                 LogHelper.WriteLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace + "." + this.GetType().Name + "." + System.Reflection.MethodInfo.GetCurrentMethod().Name, ex);
  34.             }
  35.         }
  36.         /// <summary>
  37.         /// 监听连接线程
  38.         /// </summary>
  39.         private void ThreadStartListener()
  40.         {
  41.             while (true)
  42.             {
  43.                 //int i = 0;
  44.                 // 注意: GetContext 方法将阻塞线程,直到请求到达
  45.                 HttpListenerContext context = listeren.GetContext();
  46.                 //接收到请求,用线程去处理,防止阻塞
  47.                 Thread subThread = new Thread(new ParameterizedThreadStart((currContext) =>
  48.                 {
  49.                     var request = (HttpListenerContext)currContext;
  50.                     try
  51.                     {
  52.                         //post请求
  53.                         if (request.Request.HttpMethod.ToLower().Equals("post"))
  54.                         {
  55.                             string json = PostInput(request.Request);
  56.                             Writer("success", request);
  57.                         }
  58.                         else {
  59.                             Writer("error", request);
  60.                         }
  61.                     }
  62.                     catch (Exception ex)
  63.                     {
  64.                         LogHelper.WriteLog(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace + "." + this.GetType().Name + "." + System.Reflection.MethodInfo.GetCurrentMethod().Name, ex);
  65.                         Writer("error", request);
  66.                     }
  67.                 }));
  68.                 subThread.Start(context);
  69.             }
  70.         }

  71.         /// <summary>
  72.         /// HttpListener接收post请求
  73.         /// </summary>
  74.         /// <param name="request"></param>
  75.         /// <returns></returns>
  76.         private string PostInput(HttpListenerRequest request)
  77.         {
  78.             try
  79.             {
  80.                 System.IO.Stream s = request.InputStream;
  81.                 int count = 0;
  82.                 byte[] buffer = new byte[1024];
  83.                 StringBuilder builder = new StringBuilder();
  84.                 while ((count = s.Read(buffer, 0, 1024)) > 0)
  85.                 {
  86.                     builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
  87.                 }
  88.                 s.Flush();
  89.                 s.Close();
  90.                 s.Dispose();
  91.                 return builder.ToString();
  92.             }
  93.             catch {
  94.                 return null;
  95.             }
  96.         }

  97.         /// <summary>
  98.         /// 响应内容
  99.         /// </summary>
  100.         /// <param name="str"></param>
  101.         /// <param name="context"></param>
  102.         public void Writer(string str, HttpListenerContext context)
  103.         {
  104.             HttpListenerRequest request = context.Request;
  105.             HttpListenerResponse response = context.Response;
  106.             // 构造回应内容
  107.             string responseString = str;
  108.             // 设置回应头部内容,长度,编码
  109.             response.ContentLength64
  110.                 = System.Text.Encoding.UTF8.GetByteCount(responseString);
  111.             response.ContentType = "text/html; charset=UTF-8";
  112.             // 输出回应内容
  113.             System.IO.Stream output = response.OutputStream;
  114.             System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
  115.             writer.Write(responseString);
  116.             // 必须关闭输出流
  117.             writer.Close();
  118.         }
  119.     }
  120. }
复制代码






上一篇:C# where用法解析
下一篇:HttpListenner监听Post请求参数值实体
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2016-12-15 10:55:39 | 显示全部楼层
// 注意: GetContext 方法将阻塞线程,直到请求到达
HttpListenerContext context = listeren.GetContext();
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2019-4-28 15:51:52 | 显示全部楼层
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2024-1-9 19:30:20 | 显示全部楼层
基于 HttpSelfHostServer 的控制台 Web Api 服务
https://www.itsvse.com/thread-9448-1-1.html
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-7-12 17:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表