Siekiant dar labiau supaprastinti Http protokolo klausytoją, .net pateikia mums HttpListener klasę, kuri (System.Net vardų sritimi) .net apima daugybę užduočių, kurios tvarko Http protokolą.
Pirmiausia pažvelkime į MSDN apibrėžimą:
Pastaba: Ši klasė yra nauja .NET Framework 2.0 versijoje.
Suteikia paprastą, programuojamą ir valdomą HTTP protokolo klausytuvą. Tokios klasės paveldėti neįmanoma.
Naudojimo:
viešas uždarytas klasė HttpListener : IDisposable Pastaba: Ši klasė gali būti naudojama tik Win XP arba Win Server 2003 ar naujesnėse operacinėse sistemose, nes ši klasė turi naudoti Http.sys sistemos komponentus, kad atliktų darbą. Todėl prieš naudodami pirmiausia turėtumėte įvertinti, ar ši klasė palaikoma
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Kopijuoti kodą 2. Start() metodas leidžia šiam egzemplioriui priimti gaunamas užklausas. Klausykite nedelsdami
3. Stop() metodas uždaro HttpListener objektą apdorojus visas šiuo metu eilėje esančias užklausas
4. GetContext() metodas laukia, kol gaunama užklausa grįš, kai gaus užklausą Kaip ir ankstesniame straipsnyje pateiktas "Socket" diegimo serveris, yra "Accept()" metodas, kuris abu beveik laukia gaunamų užklausų, o "GetContext()" metodas taip pat užblokuos giją, o kai bus gauta kliento užklausa, jis grąžins "HttpListenerContext" objektą, kad apdorotų kliento atsiųstą užklausą. 4.1 Užklausa Gaukite HttpListenerRequest objektą, kuris atspindi kliento išteklius.
4.1.1 AcceptType Gauna kliento priimtą MIME tipą. 4.1.2 UserLanguages Gaukite kalbos informaciją. 4.1.3 "UserAgent" gauna kliento pateiktą vartotojo agentą. 4.1.4 Antraštės Gaukite antraštės pavadinimų ir reikšmių porų rinkinį, atsiųstą užklausoje---> gautumėte ypatybę, kurios nepateikia HttpListenerRequest klasė.
4.2 Atsakymas Ši ypatybė gauna objektą HttpListenerResponse, kuris bus išsiųstas klientui atsakant į kliento užklausą.
4.2.1 ContextLength64 Gauna arba nustato į atsakymą įtrauktų kūno duomenų baitų skaičių. 4.2.2 ContextType Gauna arba nustato grąžinto turinio MIME tipą.
Atsakymo pranešimo turinys siunčiamas į kliento naršyklę srautiniu būdu.
- //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
Kopijuoti kodą
|