Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 20804|Odpowiedź: 0

[Źródło] .net implementuje prosty serwer WWW za pomocą HttpListener

[Skopiuj link]
Opublikowano 08.12.2015 14:55:12 | | | |


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

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
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.


  1. //HTTP监听
  2. private HttpListener listeren = new HttpListener();


  3.         #region 监听命令显示窗体
  4.         /// <summary>
  5.         /// 开启监听
  6.         /// </summary>
  7.         private void Init()
  8.         {
  9.             try
  10.             {
  11.                 //指定身份验证 Anonymous匿名访问
  12.                 listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  13.                 //创建IP地址
  14.                 IPAddress address = IPAddress.Parse(127.0.0.1);
  15.                 listeren.Prefixes.Add("http://" + address + ":30001/");
  16.                 listeren.Start();
  17.                 Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
  18.                 threadlistener.Start();
  19.                 MessageBox.Show("监听成功");
  20.             }
  21.             catch (Exception ex)
  22.             {
  23.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  24.             }
  25.         }
  26.         
  27.          /// <summary>
  28.         /// 监听连接线程
  29.         /// </summary>
  30.         private void ThreadStartListener()
  31.         {
  32.             try
  33.             {
  34.                 while (true)
  35.             {
  36.                 // 注意: GetContext 方法将阻塞线程,直到请求到达
  37.                 HttpListenerContext context = listeren.GetContext();
  38.                 // 取得请求对象
  39.                 HttpListenerRequest request = context.Request;
  40.                 Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
  41.                 Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
  42.                 Console.WriteLine("Accept-Language: {0}",
  43.                     string.Join(",", request.UserLanguages));
  44.                 Console.WriteLine("User-Agent: {0}", request.UserAgent);
  45.                 Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
  46.                 Console.WriteLine("Connection: {0}",
  47.                     request.KeepAlive ? "Keep-Alive" : "close");
  48.                 Console.WriteLine("Host: {0}", request.UserHostName);
  49.                 Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
  50.                 // 取得回应对象
  51.                 HttpListenerResponse response = context.Response;
  52.                 // 构造回应内容
  53.                 string responseString
  54.                     = @"<html>
  55.                         <head><title>From HttpListener Server</title></head>
  56.                         <body><h1>Hello, 码农网(www.itsvse.com).</h1></body>
  57.                         </html>";
  58.                 // 设置回应头部内容,长度,编码
  59.                 response.ContentLength64
  60.                     = System.Text.Encoding.UTF8.GetByteCount(responseString);
  61.                 response.ContentType = "text/html; charset=UTF-8";
  62.                 // 输出回应内容
  63.                 System.IO.Stream output = response.OutputStream;
  64.                 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
  65.                 writer.Write(responseString);
  66.                 // 必须关闭输出流
  67.                 writer.Close();
  68.             }
  69.             }
  70.             catch (Exception ex)
  71.             {
  72.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  73.             }
  74.         }
  75.         #endregion
Skopiuj kod







Poprzedni:WPF zamyka okna i procesy
Następny:Pozwól programowi WPF renderować motywy w stylu Win8 pod Win7
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com