PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Socket(Java)



Kratz00
16-06-2003, 23:45
ich bastel gerade so ne art http proxy
browser schickt request zum proxy
sprich das programme ließt vom socket den request vom browser

zur zeit erfolgt das lesen in einer while(true) schleife
mit der abbruchbedingung

line.equalsIgnoreCase("Proxy-Connection: close") ||
line.equalsIgnoreCase("Proxy-Connection: Keep-Alive")

aber bei post würde danach noch daten gesendet werden die somit verloren gehen

nun meine frage:
woher weiß ich wann ich das lesen beenden kann? (ich weiß ja vorher nicht die große der daten die der browser auf den socket schreibt)

vielleicht hat ja jemand auch ne ganze andere idee?

almoeli
17-06-2003, 07:26
Hi,

soweit ich mich entsinnen kann, enthält der HTTP Request Header ein Feld 'CONTENT_LENGTH', in dem steht, wie lang der Inhalt des Request (also der Post Daten) ist. Du mußt also zuerst den gesamten Header einlesen und die einzelnen Felder parsen. Danach weißt du, wie viele Bytes du noch zu lesen hast. Der Header ist übrigens zu Ende, wenn man eine Leerzeile gelesen hat. Danach folgen dann direkt die POST Daten.
Interessant ist vielleicht noch die Methode 'available' aus der Klasse InputStream. Mit dieser Methode kannst du auslesen, wie viele Bytes gerade am Socket bereitstehen um gelesen zu werden.

Gruß

almoeli

peschmae
17-06-2003, 08:03
ausserdem liefert die Methode read(byte[]) von InputStream jeweils -1 wenn der Stream zu Ende ist:

If no byte is available because the stream is at end of file, the value -1 is returned; otherwise, at least one byte is read and stored into b.

MfG Peschmä

Kratz00
17-06-2003, 12:35
das mit der read methode und -1 hatte ich schon probiert
das klappt in dem fall nicht
ich setzt die lösung aber beim lesen der antwort vom webserver zum proxy ein

da fragt sich nur warum das beim lesen vom browser zum proxy nicht klappt?

die anregung von almoeli guck ich mir später an :)

dank euch 2 erstmal

Kratz00
18-06-2003, 12:41
kommando zurück
das is browserabhängig

mit links funktioniert die available() methode gut aber mit opera zB nicht
da der rückgabewert immer 0 ist, dafür funktioniert bei opera, die read() methode und das lesen solange der rückgabewert nicht -1

scheinbar gibts da keine allgemeine lösung :)

anda_skoa
18-06-2003, 16:02
Du kannst ja das lesen im einem extra Thread machen, solange, bis eine Exception kommt, oder read -1 returned.

Ich hab da mal für einen TCP Forwarder eine StreamPipe geschrieben, die von einem InputStream liest und auf einem OutputStream schreibt, bis einer von den beiden geschlossen wird.

Hin und wieder sollte man von außen eine Methode aufrufen, die dann available() am InputStream aufruft, um sicher zu gehen, dass der lesende Thread "befreit" wird (manchmal blockiert das read wenn zwischendrinn geschlossen wird)

Ciao,
_