HTTP-Stream

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Geeecko

Betreff: HTTP-Stream

BeitragMo, März 09, 2009 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe ich mir letztens zusammen geschustert, als ich POST-Daten übertragen musste.
Code: [AUSKLAPPEN]

SuperStrict

rem
Local http:THTTPStream = THTTPStream.Create()
http.setMethod("GET")
http.setHost("www.google.de")
http.setSite("index.html")
http.setTimeout(1000)
http.connect()
Print http.sourceText()
end rem


Type TEStream
   Field socket:TSocket

   ' Öffnet eine TCP-Verbindung zu einem Server
   Function openTCPStream:TEStream(ip:Long, port:Int)
      Local stream:TEStream = New TEStream
      
      stream.socket = CreateTCPSocket()
      If(Not BindSocket(stream.socket, port)) Then RuntimeError("Can't bind Socket!")
      If(Not ConnectSocket(stream.socket, ip, port)) Then RuntimeError("Can't conneckt!")
      If(Not stream.socket.Connected()) Then RuntimeError("Not connected!")
      
      
      Return stream
   End Function
   
   
   ' Sendet eine Zeile
   Method WriteLine(msg:String)
      MSG:+"~n"
      Self.socket.send(MSG.ToCString(), Len(MSG))
   End Method
   
   
   ' Vorhandene Daten
   Method availData:Int()
      Return Self.socket.ReadAvail()
   End Method

   
   ' Ließt einen Byte
   Method ReadByte:Byte()
      If(Self.socket.ReadAvail() <> 0) Then
         Local buf:Byte[] = New Byte[1]
              Self.socket.Recv(buf, 1)
             
         Return buf[0]
      Else
         RuntimeError("Nothing to read!")
      End If
   End Method
   
   
   ' Ließt eine Zeile
   Method ReadLine:String()
      Local MSG:String = ""
      Repeat
         Local b:Byte = Self.ReadByte()
         MSG:+Chr(b)
         If(Asc(Mid(MSG, Len(MSG), 1)) = 10 And Asc(Mid(MSG, Len(MSG) - 1, 1)) = 13) Then Return Mid(MSG, 1, Len(MSG) - 2)
      Forever
   End Method
End Type




Type THTTPStream

   Field stream:TEStream
   
   Field timeout:Int
   
   Field map:TMap
   
   Field data:TBank
   
   Field host:String
   Field site:String
   Field _method:String
   
   Field content:String
   

   ' Erstellt eine Vorbereitung zur Herstellung der Verbindung
   Function Create:THTTPStream()
      Local stream:THTTPStream = New THTTPStream
      
      Return stream
   End Function
   
   
   ' Ließt die Daten etc. aus
   Method connect:Int()
      Self.stream = TEStream.openTCPStream(HostIp(Self.host), 80)
      Self.stream.WriteLine(Self._method + " /" + Self.site + " HTTP/1.1")
      Self.stream.WriteLine("Host: " + Self.host)
      Self.stream.WriteLine("Content-Type: application/x-www-form-urlencoded")
      Self.stream.WriteLine("Content-Length: " + Len(Self.content))
      Self.stream.WriteLine("")
      Self.stream.WriteLine(Self.content)
      
      Local start:Int = MilliSecs()
      While(True)
         If(MilliSecs() - start >= Self.timeout) Then Return False
         If(Self.stream.availData() <> 0) Then Exit
      Wend
      
      Self.map = CreateMap()
      
      Repeat
         Local Line:String = Self.stream.ReadLine()
         If(Line = "") Then Exit
         Self.map.Insert(Lower(Mid(Line, 1, Instr(Line, ":") - 1)), Mid(Line, Instr(Line, ":") + 2))
         Print Line
      Forever
   
      Self.data = CreateBank(Self.stream.availData())
      
      For Local i:Int = 0 To Self.stream.availData() - 1
         Self.data.PokeByte(i, Self.stream.ReadByte())
      Next

   End Method
   
   
   ' liefert den quelltext zurück
   Method sourceText:String()
      Local Text:String = ""
      For Local i:Int = 0 To Self.data.Capacity() - 1
         Text:+Chr(Self.data.PeekByte(i))
      Next
      Return Text
   End Method
   
   
   ' liefert ein wert für einen schlüssel
   Method getValue:String(key:String)
      Return String(Self.map.ValueForKey(Lower(key)))
   End Method
   
   
   ' ist ein Eintrag vorhanden?
   Method keyIsAvaible:Int(key:String)
      Return Self.map.Contains(Lower(key))
   End Method
   
   
   ' setzt den "Inhalts-String"
   Method setContent(content:String)
      Self.content = content
   EndMethod
   
   
   ' setzt die methode
   Method setMethod(_method:String)
      Self._method = _method
   End Method
   
   
   ' setzt das timeout
   Method setTimeout(timeout:Int)
      Self.timeout = timeout
   End Method
   
   
   ' setzt den host
   Method setHost(host:String)
      Self.host = host
   End Method

   
   ' Setzt die Seite
   Method setSite(site:String)
      Self.site = site
   End Method
End Type



Das Beispiel oben sollte eigentlich reichen.
Wer Post daten übertragen will, ändert die methode auf "POST" und übergibt der funktion THTTPStream-Objekt.setContent die Daten die gesendet werden sollen.
Es funktionieren nur strings.

Mit .getValue können Informationen aus dem Header ausgelesen werden, welchen der Server gesendet hat.


lg MD

Ps.: Sry für die blöde Anleitung, aber habe keine Lust eine zu schreiben, da ich es eig. nicht posten wollte Wink aber vllt braucht es wär... Bei Fragen einfach fragen.

rema

BeitragDi, März 10, 2009 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwas stimmt mit deinem Buffer nicht. Die Daten kommen nicht vollständig an.

Hatte auch noch ein Bind Problem, obwohl keines bestand...

Aber habe hier was gutes gefunden: http://www.blitzbasic.com/code...?code=2208

Geeecko

BeitragDi, März 10, 2009 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe ich auch eben gemerkt...
Ist aber schon in Arbeit.
Ist auch schon fast behoben Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group