この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 20804|答える: 0

[出典] .netはHttpListenerを用いたシンプルなウェブサーバーを実装しています

[リンクをコピー]
掲載地 2015/12/08 14:55:12 | | | |


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システムコンポーネントを必要とするからです。
したがって、使用する前にまずこのクラスがサポートされているかどうかを判断すべきです

  1. / 检查系统是否支持
  2.             if (!HttpListener.IsSupported)
  3.             {
  4.                 throw new System.InvalidOperationException(
  5.                     "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
  6.             }
コードをコピーします
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型を取得するか設定します。

応答メッセージ本文の内容はストリーミングでクライアントブラウザに送信されます。


  1. //HTTP监听
  2. private HttpListener listeren = new HttpListener();


  3.         #region 监听命令显示窗体
  4.         /// <summary>
  5.         /// 开启监听
  6.         /// </summary>
  7.         private void Init()
  8.         {
  9.             try
  10.             {
  11.                 //指定身份验证 Anonymous匿名访问
  12.                 listeren.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
  13.                 //创建IP地址
  14.                 IPAddress address = IPAddress.Parse(127.0.0.1);
  15.                 listeren.Prefixes.Add("http://" + address + ":30001/");
  16.                 listeren.Start();
  17.                 Thread threadlistener = new Thread(new ThreadStart(ThreadStartListener));
  18.                 threadlistener.Start();
  19.                 MessageBox.Show("监听成功");
  20.             }
  21.             catch (Exception ex)
  22.             {
  23.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  24.             }
  25.         }
  26.         
  27.          /// <summary>
  28.         /// 监听连接线程
  29.         /// </summary>
  30.         private void ThreadStartListener()
  31.         {
  32.             try
  33.             {
  34.                 while (true)
  35.             {
  36.                 // 注意: GetContext 方法将阻塞线程,直到请求到达
  37.                 HttpListenerContext context = listeren.GetContext();
  38.                 // 取得请求对象
  39.                 HttpListenerRequest request = context.Request;
  40.                 Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
  41.                 Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
  42.                 Console.WriteLine("Accept-Language: {0}",
  43.                     string.Join(",", request.UserLanguages));
  44.                 Console.WriteLine("User-Agent: {0}", request.UserAgent);
  45.                 Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
  46.                 Console.WriteLine("Connection: {0}",
  47.                     request.KeepAlive ? "Keep-Alive" : "close");
  48.                 Console.WriteLine("Host: {0}", request.UserHostName);
  49.                 Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
  50.                 // 取得回应对象
  51.                 HttpListenerResponse response = context.Response;
  52.                 // 构造回应内容
  53.                 string responseString
  54.                     = @"<html>
  55.                         <head><title>From HttpListener Server</title></head>
  56.                         <body><h1>Hello, 码农网(www.itsvse.com).</h1></body>
  57.                         </html>";
  58.                 // 设置回应头部内容,长度,编码
  59.                 response.ContentLength64
  60.                     = System.Text.Encoding.UTF8.GetByteCount(responseString);
  61.                 response.ContentType = "text/html; charset=UTF-8";
  62.                 // 输出回应内容
  63.                 System.IO.Stream output = response.OutputStream;
  64.                 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
  65.                 writer.Write(responseString);
  66.                 // 必须关闭输出流
  67.                 writer.Close();
  68.             }
  69.             }
  70.             catch (Exception ex)
  71.             {
  72.                 cfg.Logs.Add(new LogClass { LogStr = "HttpListener error", ExInfo = ex });
  73.             }
  74.         }
  75.         #endregion
コードをコピーします







先の:WPFはウィンドウとプロセスを閉じます
次に:WPFプログラムにWin8スタイルのテーマをWin7でレンダリングさせましょう
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com