För att ytterligare förenkla lyssnaren för Http-protokollet ger .net oss HttpListener-klassen, som (System.Net med namnrymden) .net kapslar in en serie uppgifter som hanterar Http-protokollet.
Låt oss först titta på definitionen i MSDN:
Obs: Denna klass är ny i .NET Framework version 2.0.
Tillhandahåller en enkel, programmerbar och kontrollerbar HTTP-protokolllyssnare. Det är omöjligt att ärva en sådan klass.
Användning:
publik sluten klass HttpListener : IDisposable Observera: Denna klass kan endast användas på operativsystem för Win xp eller Win Server 2003 eller senare, eftersom denna klass måste använda Http.sys systemkomponenter för att utföra uppgiften. Därför bör du först bedöma om denna klass stöds innan du använder den
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Kopiera koden 2. Start()-metoden tillåter denna instans att acceptera inkommande förfrågningar. Lyssna genast
3. Stop()-metoden stänger HttpListener-objektet efter att alla för närvarande köade förfrågningar har bearbetats
4. GetContext()-metoden väntar på att den inkommande förfrågan ska returnera när den tar emot förfrågan Precis som Socket-implementeringsservern i föregående artikel finns det en Accept()-metod, som båda nästan väntar på inkommande förfrågningar, och GetContext()-metoden blockerar också tråden, och när klientens förfrågan anländer returnerar den ett HttpListenerContext-objekt för att bearbeta den begäran som klienten skickat. 4.1 Request Obtain the HttpListenerRequest-objektet som representerar klientresursen.
4.1.1 AcceptType Erhåller den MIME-typ som accepteras av klienten. 4.1.2 UserLanguages Hämta språkinformation. 4.1.3 UserAgent hämtar användaragenten som tillhandahålls av klienten. 4.1.4 Headers Får en samling header-namn/värdepar som skickas i en förfrågan ---> få en egenskap som inte tillhandahålls av klassen HttpListenerRequest.
4.2 Svar Denna egenskap får ett HttpListenerResponse-objekt, som skickas till klienten som svar på klientens begäran.
4.2.1 ContextLength64 Hämtar eller anger antalet byte kroppsdata som ingår i svaret. 4.2.2 ContextType Hämtar eller sätter MIME-typen för det returnerade innehållet.
Innehållet i svarsmeddelandets innehåll skickas till klientens webbläsare via streaming.
- //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
Kopiera koden
|