HTTP-Request
Marko Bencun
- programmiertechnik
Hallo,
Ich bin gerade dabei, eine Winsock Klasse zu schreiben. Habe gerade den Server abgeschlossen, und teste ihn gerade als Webserver. Doch hier das Problem: Meine Klasse versucht solange zu empfangen, bis man beim Browser auf "Abbrechen" klickt, dann erst kommen die Daten an. Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann? Ist das Webclient-spezifisch? Denn wenn ich mit nem eigenen Clienten zum Server Daten schicke, klappt alles. Ich könnte mir vorstellen, das Webbrowser vom Server erwarten, selber die Verbindung abbzubrechen, wenn er z.B zwei Zeilenumbrüche bekommen hat oder so. Wie läuft das also?
Grüße, Marko Bencun
Hallo Marko,
Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?
Lies Dir am besten mal den HTTP-Standard durch: http://www.w3.org/Protocols/rfc2616/rfc2616.html Dort sollten alle Deine Fragen geklärt werden.
Viele Grüße,
Christian
Hi,
Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?
der Browser ist dann fertig, wenn Deine Auswertung ergeben hat, dass Du mit den bereits gesendeten Daten zufrieden bist.
Denn wenn ich mit nem eigenen Clienten zum Server Daten schicke, klappt alles.
Mach mal einen Test: Nimm 'nen Telnet-Client, und sende eine Handvoll Requests an irgendeinen Server. Erzeuge GET- und POST-Requests, und schaue, wann der Server die Antwort sendet. Tipp: Versuche POST-Requests mit und ohne Content-Length-Header.
Cheatah
Halihallo Marko
Ich bin gerade dabei, eine Winsock Klasse zu schreiben. Habe gerade den Server abgeschlossen, und teste ihn gerade als Webserver. Doch hier das Problem: Meine Klasse versucht solange zu empfangen, bis man beim Browser auf "Abbrechen" klickt, dann erst kommen die Daten an. Wie weiss ich, wann der Browser fertig gesendet hat und ich die Daten auswerten kann?
Der Browser sendet den Request-Header, dieser wird vom Content (bei POST-Methode) durch
zwei CRLF (\015\012\015\012, Oktal) getrennt. Wenn nun der Browser keinen Body sendet,
ist nach zwei CRLF in unmittelbarer Folge fertig. Sendet der Browser jedoch Content
mit wirst du im Header ein Feld namens "Content-Length" wiederfinden, welches angibt,
wieviele Bytes nach den zwei CRLF noch kommen und erst dann ist Schluss.
So kannst du feststellen, wann der Request beendet ist; und dann folgt deine Response.
Aber Achtung bei HTTP1.1: Connection: keep-alive hält die Verbindung auch nach der
Response offen und es folgen weitere Requests. Wenn du diesen Standard nicht unterstützt,
solltest du es dem Client über den Response-Header "Connection: close" mitteilen.
Ist das Webclient-spezifisch?
um himmelswillen nein, das wäre für das INet tödlich.
Alles und vieles mehr stehen natürlich in den Standards zu HTTP :-)
Viele Grüsse
Philipp
Hi,
Danke für die Anworten. Der Fehler an einem dummen logischen Fehler in der Schleife :/ Der Browser Request endet von selbst, ich muss nicht zwei Leerzeilen sucne o.Ä:
Dim bytes As Integer = sckConnection.Receive(recb, recb.Length, SocketFlags.None)
inp &= System.Text.Encoding.Default.GetString(recb, 0, bytes)
Do While bytes > 0 And >>>>>>>recb.Length - bytes = 0<<<<<<<<< hier war der Fehler ;)
bytes = sckConnection.Receive(recb, recb.Length, SocketFlags.None)
inp &= System.Text.Encoding.Default.GetString(recb, 0, bytes)
Loop
Grüße, Marko Bencun