Untuk lebih menyederhanakan pendengar untuk protokol Http, .net memberi kita kelas HttpListener, yang (System.Net dengan namespace) .net merangkum serangkaian tugas yang menangani protokol Http.
Mari kita lihat definisi dalam MSDN terlebih dahulu:
Catatan: Kelas ini baru di .NET Framework versi 2.0.
Menyediakan pendengar protokol HTTP yang sederhana, dapat diprogram, dan dapat dikontrol. Tidak mungkin mewarisi kelas seperti itu.
Penggunaan:
kelas tertutup publik HttpListener : IDisposable Catatan: Kelas ini hanya dapat digunakan pada sistem operasi Win xp atau Win Server 2003 atau yang lebih baru, karena kelas ini harus menggunakan komponen sistem Http.sys untuk menyelesaikan pekerjaan. Oleh karena itu, Anda harus terlebih dahulu menilai apakah kelas ini didukung sebelum menggunakannya
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Salin kode 2. Metode Start() memungkinkan instance ini untuk menerima permintaan masuk. Segera dengarkan
3. Stop() menutup objek HttpListener setelah memproses semua permintaan yang saat ini diantrek
4. Metode GetContext() menunggu permintaan masuk kembali saat menerima permintaan Sama seperti server implementasi Socket di artikel sebelumnya, ada metode Accept(), yang keduanya hampir menunggu permintaan masuk, dan metode GetContext() juga akan memblokir utas, dan ketika permintaan klien tiba, itu akan mengembalikan objek HttpListenerContext untuk memproses permintaan yang dikirim oleh klien. 4.1 Permintaan: Dapatkan objek HttpListenerRequest yang mewakili sumber daya klien.
4.1.1 AcceptType Memperoleh tipe MIME yang diterima oleh klien. 4.1.2 UserLanguages Dapatkan informasi bahasa. 4.1.3 Agen Pengguna memperoleh agen pengguna yang disediakan oleh klien. 4.1.4 Header Dapatkan kumpulan pasangan nama/nilai header yang dikirim dalam permintaan ---> mendapatkan properti yang tidak disediakan oleh kelas HttpListenerRequest.
4.2 Respons Properti ini mendapatkan objek HttpListenerResponse, yang akan dikirim ke klien sebagai respons atas permintaan klien.
4.2.1 ContextLength64 Mendapatkan atau mengatur jumlah byte data isi yang disertakan dalam respons. 4.2.2 ContextType Mendapatkan atau mengatur jenis MIME dari konten yang ditampilkan.
Konten isi pesan respons dikirim ke browser klien melalui 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
Salin kode
|