Maison > développement back-end > Tutoriel C#.Net > C# utilise Socket pour créer un petit partage de code sur un serveur Web

C# utilise Socket pour créer un petit partage de code sur un serveur Web

黄舟
Libérer: 2017-03-21 11:40:11
original
1896 Les gens l'ont consulté

Cet article présente principalement les informations pertinentes sur C# utilisant Socket pour créer un petit serveur Web. L'article le présente en détail à travers un exemple de code. Les amis qui en ont besoin peuvent s'y référer. . Bar.

Pour implémenter le serveur Web, les données consultées peuvent être obtenues via l'accès au navigateur de code suivant.

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

Thread thread = new Thread(delegate(object obj)
{
 Socket socketListen = (Socket)obj;
 while (true)
 {
  Socket socket = socketListen.Accept();
  byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据,限定为 4K。
  int length = socket.Receive(data, 0, data.Length, SocketFlags.None);
  socket.Send(Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")));
  socket.Shutdown(SocketShutdown.Both);
  socket.Close();
 }
});

thread.IsBackground = true;
thread.Start(socketWatch);
Copier après la connexion

Mais ce qui précède n'est qu'un principe. Ce sera très compliqué en pratique. Cependant, même si nous voulons créer un serveur Web simple, nous devons encore résoudre deux problèmes :

1. Sortie des en-têtes HTTP

byte[] body = Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server

");
socket.Send(head);
socket.Send(body);
Copier après la connexion

Tant qu'il a un format spécifique, il sera traité comme un en-tête HTTP par le navigateur. Le format de l'en-tête HTTP est :

  • Première ligne : HTTP/1.x code d'état de l'espace description de l'espace

  • Ligne médiane : nom deux points espace (peut également être omis) Valeur

  • Dernière ligne : Ligne vide

Le format doit être correct, sinon cela affectera le traitement par le navigateur des en-têtes HTTP et de la reconnaissance du corps HTTP.

2. Demander l'en-tête HTTP

Jusqu'à présent, nous ne savons pas quelle est l'URL saisie dans le navigateur. L'en-tête HTTP de la requête a également un format spécifique. Il suffit de le sortir et de le démonter pour obtenir l'URL.

Le démontage n'est pas difficile, parlons de comment l'obtenir. Les données et la longueur précédentes ne sont-elles pas toujours inutiles ? Comme suit :

string requestText = Encoding.UTF8.GetString(data, 0, length);
Copier après la connexion

Code complet

Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81));
socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。

Thread thread = new Thread(delegate(object obj)
{
 Socket socketListen = (Socket)obj;
 while (true)
 {
  using (Socket socket = socketListen.Accept())
  {
   byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据
   int length = socket.Receive(data, 0, data.Length, SocketFlags.None);
   if (length > 0)
   {
    string requestText = Encoding.UTF8.GetString(data, 0, length);

    byte[] body = Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
    byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK
Content-Length: " + body.Length + @"
Content-Type: text/plain
Date: " + string.Format("{0:R}", DateTime.Now) + @"
Server: Cftea Web Server

");
    socket.Send(head);
    socket.Send(body);
   }

   socket.Shutdown(SocketShutdown.Both);
   socket.Close();
  }
 }
});

thread.IsBackground = true;
thread.Start(socketWatch);
Copier après la connexion

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal