Щоб ще більше спростити слухач для протоколу Http, .net надає нам клас HttpListener, який (System.Net з простором імен) .net інкапсулює низку завдань, що обробляють протокол Http.
Давайте спочатку розглянемо визначення в MSDN:
Примітка: цей клас є новим у версії .NET Framework 2.0.
Забезпечує простий, програмований і керований слухач протоколу HTTP. Успадкувати такий клас неможливо.
Використання:
публічно запечатаний клас HttpListener : IDisposable Примітка: Цей клас можна використовувати лише на операційних системах Win XP або Win Server 2003 або новіших, оскільки він повинен використовувати Http.sys компоненти системи для виконання завдання. Тому спочатку слід оцінити, чи підтримується цей клас, перш ніж його використовувати
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Копія коду 2. Метод Start() дозволяє цьому екземпляру приймати вхідні запити. Слухай негайно
3. Метод Stop() закриває об'єкт HttpListener після обробки всіх наразі поставлених у чергу запитів
4. Метод GetContext() чекає на повернення вхідного запиту, коли отримує запит. Як і сервер реалізації Socket у попередній статті, існує метод Accept(), обидва майже чекають на вхідні запити, і метод GetContext() також блокує потік, а коли клієнтський запит надходить, він поверне об'єкт HttpListenerContext для обробки запиту, надісланого клієнтом. 4.1 Запит Отримати об'єкт HttpListenerRequest, який представляє ресурс клієнта.
4.1.1 AcceptType отримує MIME-тип, прийнятий клієнтом. 4.1.2 Мови користувача Отримати інформацію про мову. 4.1.3 UserAgent отримує користувацький агент, наданий клієнтом. 4.1.4 Заголовки Отримайте колекцію пар імен/значення заголовка, надісланих у запиті, ---> отримати властивість, яка не надається класом HttpListenerRequest.
4.2 Відповідь Ця властивість отримує об'єкт HttpListenerResponse, який буде надісланий клієнту у відповідь на запит клієнта.
4.2.1 ContextLength64 Отримує або встановлює кількість байтів основних даних, включених у відповідь. 4.2.2 ContextType Отримує або встановлює тип MIME поверненого контенту.
Вміст тіла повідомлення-відповіді надсилається до клієнтського браузера шляхом потокового потоку.
- //HTTP监听
- private HttpListener listeren = new HttpListener();
- #region 监听命令显示窗体
- /// <summary>
- /// 开启监听
- /// </summary>
- private void Init()
- {
- try
- {
- //指定身份验证 Anonymous匿名访问
- listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
- //创建IP地址
- IPAddress address = IPAddress.Parse(127.0.0.1);
- listeren.Prefixes.Add("http://" + address + ":30001/");
- listeren.Start();
- Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
- threadlistener.Start();
- MessageBox.Show("监听成功");
- }
- catch (Exception ex)
- {
- cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
- }
- }
-
- /// <summary>
- /// 监听连接线程
- /// </summary>
- private void ThreadStartListener()
- {
- try
- {
- while (true)
- {
- // 注意: GetContext 方法将阻塞线程,直到请求到达
- HttpListenerContext context = listeren.GetContext();
- // 取得请求对象
- HttpListenerRequest request = context.Request;
- Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
- Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
- Console.WriteLine("Accept-Language: {0}",
- string.Join(",", request.UserLanguages));
- Console.WriteLine("User-Agent: {0}", request.UserAgent);
- Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
- Console.WriteLine("Connection: {0}",
- request.KeepAlive ? "Keep-Alive" : "close");
- Console.WriteLine("Host: {0}", request.UserHostName);
- Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
- // 取得回应对象
- HttpListenerResponse response = context.Response;
- // 构造回应内容
- string responseString
- = @"<html>
- <head><title>From HttpListener Server</title></head>
- <body><h1>Hello, 码农网(www.itsvse.com).</h1></body>
- </html>";
- // 设置回应头部内容,长度,编码
- response.ContentLength64
- = System.Text.Encoding.UTF8.GetByteCount(responseString);
- response.ContentType = "text/html; charset=UTF-8";
- // 输出回应内容
- System.IO.Stream output = response.OutputStream;
- System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
- writer.Write(responseString);
- // 必须关闭输出流
- writer.Close();
- }
- }
- catch (Exception ex)
- {
- cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
- }
- }
- #endregion
Копія коду
|