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!