Для дальнейшего упрощения работы слушателя протокола 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
Копирование кода
|