Aby sme ešte viac zjednodušili poslucháča pre Http protokol, .net nám poskytuje triedu HttpListener, ktorá (System.Net s menným priestorom) .net zapuzdrí sériu úloh, ktoré spracovávajú Http protokol.
Najskôr sa pozrime na definíciu v MSDN:
Poznámka: Táto trieda je nová vo verzii .NET Framework 2.0.
Poskytuje jednoduchý, programovateľný a ovládateľný poslucháč HTTP protokolu. Takúto triedu nie je možné zdediť.
Použitie:
verejná uzavretá trieda HttpListener : IDisposable Poznámka: Táto trieda môže byť použitá iba na operačných systémoch Win XP alebo Win Server 2003 či novších, pretože táto trieda musí používať Http.sys systémové komponenty na splnenie úlohy. Preto by ste mali najskôr posúdiť, či je táto trieda podporovaná, než ju použijete
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Kopírovať kód 2. Metóda Start() umožňuje tejto inštancii prijímať prichádzajúce požiadavky. Počúvaj okamžite
3. Metóda Stop() uzavrie objekt HttpListener po spracovaní všetkých aktuálne zaradených požiadaviek
4. Metóda GetContext() čaká, kým sa prichádzajúci požiadavok vráti, keď požiadavku prijme. Rovnako ako implementačný server Socketu v predchádzajúcom článku, existuje metóda Accept(), ktoré takmer čakajú na prichádzajúce požiadavky, a metóda GetContext() tiež zablokuje vlákno, a keď dorazí požiadavka klienta, vráti objekt HttpListenerContext na spracovanie požiadavky odoslanej klientom. 4.1 Požiadavka Získajte objekt HttpListenerRequest, ktorý reprezentuje klientský zdroj.
4.1.1 Akceptovať typ získava MIME typ akceptovaný klientom. 4.1.2 UserLanguages Získajte informácie o jazykoch. 4.1.3 UserAgent získava používateľského agenta poskytnutého klientom. 4.1.4 Hlavičky Získajte kolekciu párov meno/hodnota hlavičky odoslaných v požiadavke, ---> získate vlastnosť, ktorú neposkytuje trieda HttpListenerRequest.
4.2 Odpoveď Táto vlastnosť dostane objekt HttpListenerResponse, ktorý bude oslaný klientovi na jeho požiadavku.
4.2.1 ContextLength64 Získa alebo nastaví počet bajtov telesných dát zahrnutých v odpovedi. 4.2.2 ContextType Získa alebo nastaví MIME typ vráteného obsahu.
Obsah tela odpovednej správy sa odosiela do prehliadača klienta streamovaním.
- //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
Kopírovať kód
|