lesen Grüße!Web-Server: http-Anfrage aus dem Stream
Ich habe mit C# (wieder) herumalbern und jetzt bin ich mit einfachen HTTP-Webserver-Implementierung stecken geblieben. Ehrlich gesagt, möchte ich nicht mit HTTP-Spezifikation auskommen - ich muss nur eine sehr kleine winzige (lesen Sie als einfache) HTTP-Webserver. Und ich habe dieses Problem gefördert: Client sendet Anfrage an den Server und dann Server analysiert es, führt einige Aktionen, baut Antwort und sendet es zurück an den Client. Das scheint (zumindest für mich) offensichtlich zu sein.
Hier ist, was ich bisher habe:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 80);
listener.Start();
Socket sock = listener.AcceptSocket();
try
{
Stream s = new NetworkStream(sock);
s.ReadTimeout = 300;
StreamReader reader = new StreamReader(s);
StreamWriter writer = new StreamWriter(s);
writer.AutoFlush = true;
Console.WriteLine("Client stream read:\r\n");
string str = "none";
while (sock.Connected && !reader.EndOfStream && str.Length > 0) // here's where i'm stuck
{
str = reader.ReadLine();
Console.WriteLine("{0} ({1})", str, str.Length);
}
Console.WriteLine("Sending response...\r\n");
{
string response = "<h1>404: Page Not Found</h1>";
writer.WriteLine("HTTP/1.1 404 Not Found");
writer.WriteLine("Content-Type: text/html; charset=utf-8");
writer.WriteLine("Content-Length: {0}", response.Length);
writer.WriteLine("\r\n{0}", response);
}
Console.WriteLine("Client: over\r\n");
s.Close();
sock.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception: {0}\r\nTrace: \r\n{1}", e.Message, e.StackTrace);
}
Console.ReadKey();
}
}
}
Aber ich habe einen „Unterwasser-Stein“ erfüllt werden: i Anfrage über den Eingangsstrom gerade lese, so Eingangsdatenfluss, wenn Client schließt beendet werden Seite in seinem Browser (lassen Sie uns über die offensichtlichsten Aktionen sprechen, ausgenommen Curl, W3 und andere "Geek-Zeug").
So ist die Frage: wie Anfrage 'Ende zu bestimmen? Z.B. Wann sollte ich aufhören, Anforderungsdaten zu lesen und die Antwort zu senden?
Warum verwenden Sie nicht 'HttpListener'? – SLaks
, weil es in einigen Windows-Versionen nicht unterstützt wurde. – shybovycha