Pro další zjednodušení posluchače pro protokol Http poskytuje .net třídu HttpListener, která (System.Net s jmenným prostorem) .net zapouzdřuje sérii úloh zpracovávajících protokol Http.
Podívejme se nejdříve na definici v MSDN:
Poznámka: Tato třída je nová ve verzi .NET Framework 2.0.
Poskytuje jednoduchý, programovatelný a ovladatelný posluchač HTTP protokolu. Takovou třídu nelze zdědit.
Zvyk:
veřejná uzavřená třída HttpListener : IDisposable Poznámka: Tato třída může být použita pouze na operačních systémech Win XP nebo Win Server 2003 či novějších, protože tato třída musí používat Http.sys systémové komponenty, aby byla splněna. Proto byste měli nejprve posoudit, zda je tato třída podporována, než ji použijete
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Kopírovat kód 2. Metoda Start() umožňuje této instanci přijímat příchozí požadavky. Poslouchej hned
3. Metoda Stop() uzavře objekt HttpListener po zpracování všech aktuálně zařazených požadavků
4. Metoda GetContext() čeká, až se příchozí požadavek vrátí, když požadavek přijme. Stejně jako server implementace socketu v předchozím článku existuje metoda Accept(), obě téměř čekají na příchozí požadavky, a metoda GetContext() také zablokuje vlákno, a když dorazí požadavek klienta, vrátí objekt HttpListenerContext, který zpracuje požadavek odeslaný klientem. 4.1 Požadavek Získejte objekt HttpListenerRequest, který reprezentuje klientský zdroj.
4.1.1 Přijmout Typ získá MIME typ přijatý klientem. 4.1.2 UserLanguages Získejte informace o jazycích. 4.1.3 UserAgent získává uživatelského agenta poskytnutého klientem. 4.1.4 Hlavičky Získejte kolekci dvojic jména/hodnota hlaviček zaslaných v požadavku ---> získání vlastnosti, která není poskytována třídou HttpListenerRequest.
4.2 Odpověď Tato vlastnost získá objekt HttpListenerResponse, který je klientovi odeslán na jeho požadavek.
4.2.1 ContextLength64 Získá nebo nastaví počet bajtů tělesných dat zahrnutých v odpovědi. 4.2.2 ContextType Získá nebo nastaví MIME typ vráceného obsahu.
Obsah těla odpovědi je do klientského prohlížeče odeslán streamování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írovat kód
|