Httpプロトコルのリスナーをさらに簡素化するために、.netはHttpListenerクラスを提供しており、名前空間 System.Net.netはHttpプロトコルを扱う一連のタスクをカプセル化しています。
まずMSDNの定義を見てみましょう。
注:このクラスは.NET Frameworkバージョン2.0で新たに導入されました。
シンプルでプログラム可能かつ制御可能なHTTPプロトコルリスナーを提供します。 そのような階級を継承することは不可能です。
使い:
public sealed class HttpListener : IDisposable 注:このクラスはWindows XPまたはWindows Server 2003以降のオペレーティングシステムでのみ使用可能です。なぜなら、このクラスは作業を行うためにHttp.sysシステムコンポーネントを必要とするからです。 したがって、使用する前にまずこのクラスがサポートされているかどうかを判断すべきです
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
コードをコピーします 2. Start()メソッドは、このインスタンスが受信リクエストを受け入れることを可能にします。 すぐに聞いてください
3. Stop() メソッドは、現在キューに待機中のすべてのリクエストを処理した後、HttpListener オブジェクトを閉じます
4. GetContext() メソッドは、リクエストを受け取ったときにリクエストが戻るのを待ちます。前記事の Socket 実装サーバーと同様に、Accept() メソッドがあり、どちらもほぼ受信リクエストを待機しています。GetContext() メソッドもスレッドをブロックし、クライアントのリクエストが届くとクライアントからのリクエストを処理するための HttpListenerContext オブジェクトを返します。 4.1 リクエスト クライアントリソースを表すHttpListenerRequestオブジェクトを取得します。
4.1.1 AcceptType クライアントが受け入れたMIMEタイプを取得します。 4.1.2 ユーザー言語 言語情報を取得する。 4.1.3 UserAgentはクライアントから提供されたユーザーエージェントを取得します。 4.1.4 ヘッダー リクエストで送信されるヘッダー名/値ペアの集合---> HttpListenerRequest クラスで提供されていないプロパティを取得します。
4.2 応答このプロパティはHttpListenerResponseオブジェクトを受け取り、クライアントの要求に応じてクライアントに送信されます。
4.2.1 ContextLength64 応答に含まれる本文データのバイト数を取得するか設定します。 4.2.2 ContextType は、返されるコンテンツのMIME型を取得するか設定します。
応答メッセージ本文の内容はストリーミングでクライアントブラウザに送信されます。
- //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
コードをコピーします
|