Website auslesen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Der Eisvogel

Betreff: Website auslesen

BeitragDi, Mai 25, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich versuche gerade eine Datei die auf meinem Webserver liegt mit BM auszulesen.

Folgender Code soll das bewerkstelligen:
BlitzMax: [AUSKLAPPEN]
Local stream:TStream = ReadURL("dereisvogel.kilu.de")
If stream Then Print "Die Verbindung wurde erfolgreich aufgebaut" Else End

stream.WriteLine("GET /lclevelbot.ini HTTP/1.1")
stream.WriteLine("Host: dereisvogel.kilu.de")
stream.WriteLine("")

While Not Eof(stream)
Print ReadLine(stream)
Wend

Print "Die URL wurde erfolgreich empfangen."

CloseStream(stream)
Input("Press Enter ...")
End


Function ReadURL:TStream(url:String)
Local Socket:TSocket = CreateTCPSocket()
If Not Socket.Connect(HostIp(url), 80) Then Notify("Die Verbindung zu " + Chr(34) + url + Chr(34) + " konnte nicht hergestellt werden.") ; Return Null
Local stream:TStream = CreateSocketStream(Socket)
Return stream
End Function


Soweit so gut. Alles funktioniert. Als Ausgabe bekomme ich den Header, und den Content, allerdings sieht dieser etwas merkwürdig aus:
Zitat:
b

[default]



5

run=1

0


Während ich diese schreibe fällt mir auch grade auf, dass es hier im Forum sogar anders angezeigt wird als im Debugger. Im Debugger sieht das so aus:
Zitat:
b
[default]

5
run=1
0


Die auf meinem Server hinterlegte Datei beinhaltet allerdings folgendes:
Zitat:
[default]
run=1

Diese habe ich ganz normal mit dem Standard Editor von Windows gemacht.

Diese "Zusatz"-Zeichen haben bestimmt irgendeinen Zweck, aber ich keinerlei Schimmer welchen und wie ich diese auswerten soll. Vielleicht mache ich ja etwas bei der Anfrage falsch.
Ich bin froh über jede Hilfe, denn ich möchte diese Datei als eine INI-Datei in meinem Programm verwenden.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

FWeinb

ehemals "ich"

BeitragDi, Mai 25, 2010 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Server Antwortet mit "Transfer-Encoding: chunked" Du musst dir also die Dokumentation für diese Codierung anschauen. Google sollte da helfen.

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Goodjee

BeitragDi, Mai 25, 2010 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
halbwegs offtopic:
Code: [AUSKLAPPEN]

file=OpenFile("http::www.blitzforum.de")
While Not Eof(file)
   Print ReadLine(file)
Wend


ist doch viel einfacher Wink
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Der Eisvogel

BeitragDi, Mai 25, 2010 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
OK. Was muss ich machen, dass der mir das "normal" liefert?
Firefox schickt folgendes an den Server:
Zitat:
GET /lclevelbot.ini HTTP/1.1
Host: dereisvogel.kilu.de
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
If-Modified-Since: Tue, 25 May 2010 13:50:47 GMT
If-None-Match: "188920e8-10-4876b71d0193f"
Cache-Control: max-age=0


Und bekommt das wieder:
Zitat:
HTTP/1.1 304 Not Modified
Date: Tue, 25 May 2010 18:50:15 GMT
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=3, max=100
Etag: "188920e8-10-4876b71d0193f"


Wenn ich das gleiche schicke bekomme ich das hier wieder:
Zitat:
HTTP/1.1 200 OK

Date: Tue, 25 May 2010 18:56:44 GMT

Server: Apache

Last-Modified: Tue, 25 May 2010 13:50:47 GMT

ETag: "188920e8-10-4876b71d0193f"

Accept-Ranges: bytes

Vary: Accept-Encoding

Content-Encoding: gzip

Content-Length: 36

Keep-Alive: timeout=3, max=100

Connection: Keep-Alive

Content-Type: text/plain



‹











‹NIMK,Í)‰åå**ͳ5

$-æâ


Wie mache ich dem Server klar, dass er es mir normal schickt?

EDIT: @Goodjee: Cool danke, das kannte ich nicht. Aber das geht prima. Dennoch möchte ich aus Prinzip trotzdem noch wissen wie ich das mit meiner Methode lösen kann, damit wenn ich das doch mal brauchen werde, nicht wieder vor dme selben Mist stehe.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
  • Zuletzt bearbeitet von Der Eisvogel am Di, Mai 25, 2010 21:01, insgesamt einmal bearbeitet

Goodjee

BeitragDi, Mai 25, 2010 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
file=OpenStream("http::dereisvogel.kilu.de/lclevelbot.ini")
While Not Eof(file)
Print ReadLine(file)
Wend


das liefert bei mir die datei ohne komische zeilenumbrüche
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

FWeinb

ehemals "ich"

BeitragDi, Mai 25, 2010 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So kann man es auch machen Goodjee. Um das HTT-Protokoll aber zu verstehen, habe ich dir das mal geschrieben.
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local stream:TSocketStream = TSocketStream.CreateClient("dereisvogel.kilu.de",80)
If stream Then Print "Die Verbindung wurde erfolgreich aufgebaut" Else End

stream.WriteLine("GET /lclevelbot.ini HTTP/1.1")
stream.WriteLine("Host: dereisvogel.kilu.de"+Chr(10))

Repeat
Until Stream.ReadLine() = ""

Local Res:String, Line:String
Repeat
Line = stream.ReadLine()
For Local i:Int = 1 To Int("$"+Line)
Res:+Chr(Stream.ReadByte())
Next
Until Line = "0"
Print Res


Hier etwas Texterklärung dazu:
Der Type: TSocketStream, kümmert sich um das Verbinden und alles weitere. Die Funktion ReadURL brauchst du also nicht mehr. Als erstes steht die "Größe" des folgenden Chunkes als Hex im Stream diese wird ausgelesen. Danach gehe ich in der For Next Schleife alle Bytes durch und füge sie dem resultierenden String hinzu ( Int("$a") gibt mir den Dezimalwert der Hexzahl a zurück)
Wenn ein Chunk 0 Byte groß ist, ist der Content zu Ende und es kann aufgehört werden zu suchen.
Quelle:http://www.jmarshall.com/easy/http/#http1.1c2

Beide Funktionen brauchen hier ~100ms und sind beide so gut wie gleich schnell (Die von Goodjee ist um 3ms schneller)


[Edit]
Zitat:
Accept-Encoding: gzip,deflate

Der Firefox kommt mit "Komprimierten"-Daten zurecht. Diese werden "On-the-fly" Entpackt und dann dargestellt. Das in BlitzMax zu Implementieren dürfte etwas zu aufwendig sein für so eine "einfache" Abfrage.
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Der Eisvogel

BeitragDi, Mai 25, 2010 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok. Das hab ich verstanden. Aber besteht auch die Möglichkeit das ganze vom Server direkt so zu erhalten wie bei Goodjee's Methode? Natürlich mit dem Header.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

FWeinb

ehemals "ich"

BeitragDi, Mai 25, 2010 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem Beispiel oben "Überlese" ich den Header einfach mit der Schleife:
BlitzMax: [AUSKLAPPEN]
Repeat
Until Stream.ReadLine() = ""


Hier mit Ausgabe des Headers:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Local stream:TSocketStream = TSocketStream.CreateClient("dereisvogel.kilu.de",80)
If stream Then Print "Die Verbindung wurde erfolgreich aufgebaut" Else End

stream.WriteLine("GET /lclevelbot.ini HTTP/1.1")
stream.WriteLine("Host: dereisvogel.kilu.de"+Chr(10))

Print "Header"
Local Header:String
Repeat
Header = Stream.ReadLine()
Print Header
Until Header = ""

Print "Content"
Local Res:String, Line:String
Repeat
Line = stream.ReadLine()
For Local i:Int = 1 To Int("$"+Line)
Res:+Chr(Stream.ReadByte())
Next
Until Line = "0"
Print Res
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Der Eisvogel

BeitragDi, Mai 25, 2010 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das habe ich verstanden. Aber ich meine kann man es direkt vom Server so krigen ohne es selber auswerten zu müssen?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

FWeinb

ehemals "ich"

BeitragDi, Mai 25, 2010 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist keine bekannt. Könntest ja schauen wie OpenStream das ganze macht. Also wie es den Stream aufbaut.

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

mpmxyz

BeitragMi, Mai 26, 2010 8:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal den entsprechenden Code aus BlitzMax - brl.httpstream - herausgesucht:
BlitzMax: [AUSKLAPPEN]
			stream.WriteLine "GET "+file+" HTTP/1.0"
stream.WriteLine "Host: "+server
stream.WriteLine ""

While Not Eof( stream )
If Not stream.ReadLine() Exit
Wend

Hier wird HTTP 1.0, welches kein Aufteilen in Chunks unterstützt, genutzt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Der Eisvogel

BeitragMi, Mai 26, 2010 8:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ok. Danke.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group