Aby jeszcze bardziej uprościć słuchacz protokołu Http, .net udostępnia nam klasę HttpListener, która (System.Net z przestrzenią nazw) .net zawiera szereg zadań obsługujących protokół Http.
Przyjrzyjmy się najpierw definicji w MSDN:
Uwaga: Ta klasa jest nowa w .NET Framework w wersji 2.0.
Zapewnia prosty, programowalny i kontrolowalny nasłuchiwacz protokołu HTTP. Nie da się odziedziczyć takiej klasy.
Zwyczaj:
publiczna zamknięta klasa HttpListener : IDisposable Uwaga: Ta klasa może być używana tylko na systemach Win XP lub Win Server 2003 lub nowszych, ponieważ musi wykorzystywać Http.sys komponenty systemowe, aby wykonać zadanie. Dlatego najpierw powinieneś ocenić, czy ta klasa jest wspierana, zanim jej użyjesz
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Skopiuj kod 2. Metoda Start() pozwala tej instancji przyjmować przychodzące żądania. Słuchaj natychmiast
3. Metoda Stop() zamyka obiekt HttpListener po przetworzeniu wszystkich obecnie kolejkowanych żądań
4. Metoda GetContext() czeka na zwrot przychodzącego żądania w momencie otrzymania żądania. Podobnie jak serwer implementacyjny Socket w poprzednim artykule, istnieje metoda Accept(), obie niemal czekające na przychodzące żądania, a metoda GetContext() również blokuje wątek, a gdy żądanie klienta dotrze, zwraca obiekt HttpListenerContext, aby przetworzyć żądanie wysłane przez klienta. 4.1 Żądaj Uzyskaj obiekt HttpListenerRequest reprezentujący zasób klienta.
4.1.1 AcceptType uzyskuje akceptowany przez klienta typ MIME. 4.1.2 UserLanguages Uzyskaj informacje o języku. 4.1.3 UserAgent pobiera agenta użytkownika dostarczonego przez klienta. 4.1.4 Nagłówki Otrzymaj kolekcję par nagłówka/wartość wysyłanych w żądaniu ---> otrzymać właściwość, która nie jest dostarczana przez klasę HttpListenerRequest.
4.2 Odpowiedź Ta własność otrzymuje obiekt HttpListenerResponse, który zostanie wysłany do klienta w odpowiedzi na jego żądanie.
4.2.1 ContextLength64 Otrzymuje lub ustawia liczbę bajtów danych objętych odpowiedzią. 4.2.2 Kontekst Otrzymuje lub ustawia typ MIME zwróconej treści.
Treść treści wiadomości odpowiedzi jest przesyłana do przeglądarki klienta poprzez streaming.
- //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
Skopiuj kod
|