Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 20804|Vastaus: 0

[Lähde] .net toteuttaa yksinkertaisen verkkopalvelimen HttpListenerin avulla

[Kopioi linkki]
Julkaistu 8.12.2015 14.55.12 | | | |


Helpottaaksemme Http-protokollan kuuntelijaa .net tarjoaa meille HttpListener-luokan, joka (System.Net nimiavaruuden kanssa) .net kapseloi joukon tehtäviä, jotka käsittelevät Http-protokollaa.

Katsotaanpa ensin MSDN:n määritelmää:

Huomautus: Tämä luokka on uusi .NET Frameworkin versiossa 2.0.



Tarjoaa yksinkertaisen, ohjelmoitavan ja hallittavan HTTP-protokollan kuuntelijan. Tällaisen luokan periminen on mahdotonta.

Käyttö:

julkinen suljettu luokka HttpListener : IDisposable
Huomautus: Tätä luokkaa voi käyttää vain Win xp:ssä tai Windows Server 2003:ssa tai uudemmissa käyttöjärjestelmissä, koska tämän luokan on käytettävä Http.sys järjestelmäkomponentteja tehtävän suorittamiseksi.
Siksi sinun tulisi ensin arvioida, onko tämä luokka tuettu ennen sen käyttöä

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
Kopioi koodi
2. Start()-metodi sallii tämän instanssin hyväksyä saapuvat pyynnöt. Kuuntele heti

3. Stop()-metodi sulkee HttpListener-objektin sen jälkeen, kun kaikki jonossa olevat pyynnöt on käsitelty

4. GetContext()-metodi odottaa saapuvan pyynnön palautumista vastaanottaessaan pyynnön. Aivan kuten edellisessä artikkelissa mainittu Socket-toteutuspalvelin, on olemassa Accept()-metodi, joka lähes odottaa saapuvia pyyntöjä, ja GetContext()-menetelmä estää myös säikeen, ja kun asiakkaan pyyntö saapuu, se palauttaa HttpListenerContext-objektin käsittelemään asiakkaan lähettämää pyyntöä.
    4.1 Pyyntö Hae HttpListenerRequest-objekti, joka edustaa asiakasresurssia.

          4.1.1 AcceptType Saa asiakkaan hyväksymän MIME-tyypin.
4.1.2 Käyttäjäkielet Hanki kielitietoa.
          4.1.3 UserAgent hakee asiakkaan tarjoaman käyttäjäagentin.
          4.1.4 Otsikot Hanki kokoelma otsikon nimi/arvopareja, jotka lähetetään pyynnössä ---> saat ominaisuuden, jota HttpListenerRequest-luokka ei tarjoa.

4.2 Vastaus Tämä ominaisuus saa HttpListenerResponse-objektin, joka lähetetään asiakkaalle vastauksena asiakkaan pyyntöön.

4.2.1 ContextLength64 Saa tai asettaa vastaukseen sisällytettyjen runkotietojen tavujen määrän.
          4.2.2 ContextType Saa tai asettaa palautetun sisällön MIME-tyypin.

Vastausviestin rungon sisältö lähetetään asiakasselaimeen suoratoiston avulla.


  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
Kopioi koodi







Edellinen:WPF sulkee ikkunoita ja prosesseja
Seuraava:Anna WPF-ohjelmasi renderöidä Win8-tyylisiä teemoja Win7:n alla
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com