Pour simplifier encore davantage l’écouteur du protocole Http, .net nous fournit la classe HttpListener, qui (System.Net avec l’espace de noms) .net encapsule une série de tâches gérant le protocole Http.
Examinons d’abord la définition dans la MSDN :
Note : Cette classe est nouvelle dans la version 2.0 de .NET Framework.
Fournit un écouteur de protocole HTTP simple, programmable et contrôlable. Il est impossible d’hériter d’une telle classe.
Usage:
Classe publique scellée HttpListener : IDispositable Note : Cette classe ne peut être utilisée que sur Windows XP ou Windows Server 2003 ou versions ultérieures, car elle doit utiliser Http.sys composants système pour accomplir sa tâche. Par conséquent, vous devriez d’abord juger si ce cours est pris en charge avant de l’utiliser
- / 检查系统是否支持
- if (!HttpListener.IsSupported)
- {
- throw new System.InvalidOperationException(
- "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
- }
Code de copie 2. La méthode Start() permet à cette instance d’accepter les requêtes entrantes. Écoute immédiatement
3. La méthode Stop() ferme l’objet HttpListener après avoir traité toutes les requêtes actuellement en file d’attente
4. La méthode GetContext() attend que la requête entrante revienne lorsqu’elle reçoit la requête. Comme le serveur d’implémentation Socket dans l’article précédent, il existe une méthode Accept(), qui attend presque les requêtes entrantes, et la méthode GetContext() bloquera également le thread, et lorsque la requête du client arrive, elle retournera un objet HttpListenerContext pour traiter la requête envoyée par le client. 4.1 Request Obtenez l’objet HttpListenerRequest qui représente la ressource client.
4.1.1 AcceptType obtient le type MIME accepté par le client. 4.1.2 LanguesUtilisateurs Obtenir des informations linguistiques. 4.1.3 UserAgent obtient l’agent utilisateur fourni par le client. 4.1.4 En-têtes Obtenez une collection de paires nom/valeur d’en-tête envoyée dans une requête ---> obtenez une propriété qui n’est pas fournie par la classe HttpListenerRequest.
4.2 Réponse Cette propriété reçoit un objet HttpListenerResponse, qui sera envoyé au client en réponse à la demande du client.
4.2.1 ContextLongueur64 Obtient ou définit le nombre d’octets de données corporelles incluses dans la réponse. 4.2.2 ContextType Obtient ou définit le type MIME du contenu retourné.
Le contenu du corps du message de réponse est envoyé au navigateur client par 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
Code de copie
|