Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 20804|Απάντηση: 0

[Πηγή] Το .net υλοποιεί έναν απλό διακομιστή ιστού χρησιμοποιώντας το HttpListener

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 8/12/2015 2:55:12 μ.μ. | | | |


Για να απλοποιήσουμε περαιτέρω τον ακροατή για το πρωτόκολλο Http, το .net μας παρέχει την κλάση HttpListener, η οποία (System.Net με τον χώρο ονομάτων) .net ενσωματώνει μια σειρά εργασιών που χειρίζονται το πρωτόκολλο Http.

Ας ρίξουμε πρώτα μια ματιά στον ορισμό στο MSDN:

Σημείωση: Αυτή η κλάση είναι νέα στο .NET Framework έκδοση 2.0.



Παρέχει ένα απλό, προγραμματιζόμενο και ελεγχόμενο πρόγραμμα ακρόασης πρωτοκόλλου HTTP. Είναι αδύνατο να κληρονομηθεί μια τέτοια τάξη.

Χρήση:

δημόσια σφραγισμένη κλάση HttpListener : IDisposable
Σημείωση: Αυτή η κλάση μπορεί να χρησιμοποιηθεί μόνο σε λειτουργικά συστήματα Win xp ή Win 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 Λαμβάνει ή ορίζει τον αριθμό των byte των δεδομένων σώματος που περιλαμβάνονται στην απόκριση.
          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 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com