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

黄舟
黄舟original
2017-03-21 11:40:111893parcourir

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);

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);

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);

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);

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!

Déclaration:
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