Heim >Backend-Entwicklung >C#.Net-Tutorial >C# verwendet Socket, um eine kleine Webserver-Codefreigabe zu erstellen

C# verwendet Socket, um eine kleine Webserver-Codefreigabe zu erstellen

黄舟
黄舟Original
2017-03-21 11:40:111892Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur Verwendung von Socket zum Erstellen eines kleinen Webservers vorgestellt. Freunde, die ihn benötigen, können einen Blick darauf werfen . Bar. Um den Webserver zu implementieren, können die abgerufenen Daten über den folgenden Code-Browserzugriff abgerufen werden.

Aber das Obige ist nur ein Prinzip. In der Praxis wird es jedoch sehr kompliziert sein. Selbst wenn wir einen einfachen Webserver erstellen möchten, müssen wir noch zwei Probleme lösen:
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);

1. HTTP-Header ausgeben

Solange es ein bestimmtes Format hat, wird es vom Browser als HTTP-Header behandelt. Das Format des HTTP-Headers ist:
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);

    Erste Zeile: HTTP/1.x + Leerzeichen + Statuscode + Leerzeichen + Beschreibung
  • Mitte Zeile: Name + Doppelpunkt + Leerzeichen (kann auch weggelassen werden) + Wert
  • Letzte Zeile: Leerzeile

  • Das Format muss korrekt sein. Andernfalls wird die Erkennung von HTTP-Headern und HTTP-Körpern durch den Browser beeinträchtigt.

2. HTTP-Header anfordern

Bisher wissen wir nicht, wie die im Browser eingegebene URL lautet. Der HTTP-Header der Anfrage hat ebenfalls ein bestimmtes Format. Wir müssen ihn nur herausholen und zerlegen, um die URL zu erhalten.

Die Demontage ist nicht schwierig. Lassen Sie uns darüber sprechen, wie Sie sie erhalten. Sind die vorherigen Daten und Längen nicht immer nutzlos? Wie folgt:

string requestText = Encoding.UTF8.GetString(data, 0, length);
Vollständiger Code

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

Das obige ist der detaillierte Inhalt vonC# verwendet Socket, um eine kleine Webserver-Codefreigabe zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn