problem ze strumieniami

0

Witam. Piszę program mający na celu pobranie kodu strony HTML. I pojawił się problem:

this.inputStream = this.socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(this.inputStream));
String linia1 = reader.readLine();
reader = new BufferedReader(new InputStreamReader(this.inputStream));
String linia2 = reader.readLine();

Ja widzicie: buduję obiekt klasy Socket (socket), następnie otwieram InputStream z tego gniazda (inputStream), następnie tworzę ze strumienia BufferedReader (reader). No i na końcu czytam po kolei linie odpowiedzi.
czytam linikę pierwszą, ok, wszystko w porządku (czyli dostaję np: "HTTP/1.0 200 OK"),
ale już gdy czytam drugą linię: linia2, dostaję najczęściej 20 lub 30 linikę odpowiedzi.
Poprzez tą linikę kodu:
reader = new BufferedReader(new InputStreamReader(this.inputStream));
"zjadane" zostaje lilkanaście linijek odpowiedzi!
Oczywiście gdyby usunąć powyższy kod linia druga byłaby rzeczywiście drugą liniką odpowiedzi serwera, np: "Cache-Control: private".
Jednak dlaczego dodanie tejże linki nieprawidłowo czyta kod?
Proszę o darowanie sobie odpowiedzi: "To wywal tą linię!" bo to nie jest rozwiązanie... chciałbym znać przyczynę tego problemu.

Dzięki za odpowiedź

0

A po co drugi raz sie tym samym readerem podpinac do tego samego stream-a? za pierwszym razem (podczas tworzenia) reader podpina sie do strumienia i wczytuje sobie ilestam linii(bo jest buforowany) pozniej gdy dajesz

reader = new BufferedReader(new InputStreamReader(this.inputStream));

reader wywala z buffora to co bylo(ale jeszcze tego nie pobrales za pomoca readLine) i zaczyna nowe czytanie(bufforowanie) ze strumienia(ale od tego momentu na ktorym poprzednio skonczyl buforowac czyli tu masz te zjedzone linie)

Mysle że chyba o to chodzi

0

A więc tak: próbuje napisać klasę na wzór CSharpowego HttpWebReuqest. Jak to ma działać?
na obiekcie klasy HttpWebRequest wywołuje metodę createResponse(). Metoda ta, tworzy z gniazda BufferedReader i czyta z niego odpowiedź ( ale tylko nagłówki! ), czyli tylko do "\r\n\r\n". I to tyle jeśli chodzi o tą metodę. Dopiero później użytkownik może za pomocą metody getResponseStream pobrać InputStream gniazda, na tej podstawie zbudować BufferedReader i np pobrać kod strony (ale już bez nagłówków).

Pytanie, jak pobrać (szybko i łatwo) nagłówki odpowiedzi, jeśli nie można tego zrobić za pomocą BufferedReader i readLine() (w mojej metodzie createResponse)?

0

nie wiem czy to będzie dobre ale sprobuj tak :

DataInputStream din = new DataInputStream(socket.getInputStream());
String costam = din.readUTF();

0

Prawie ;)
Gdy użyłem tego kodu:

DataInputStream din = new DataInputStream(socket.getInputStream());
String costam = din.readUTF();

Wyskoczył wyjątek:
java.io.UTFDataFormatException: malformed input around byte 2514
Jednak gdy zmieniłem część kodu na:
String costam = din.readLine(); // zamieniłem metodę readUTF() na readLine()
Wszystko pięknie działa, to znaczy pobieram np jedną linię powyższym sposobem, następnie tworzę BufferedReader i ściągam kolejne liniki odpowiedzi począwszy od drugiej (a nie np 20 ;-) ).
Dzięki za pomoc.

ps: co to znaczy, że metoda ma status deprecated (bo taki status ma właśnie readLine())?

0
Roland napisał(a)

ps: co to znaczy, że metoda ma status deprecated (bo taki status ma właśnie readLine())?

Oznaczo to że metoda jest nie zalecana ponieważ nie ma żadnej gwarancji na to że pojawi się w następnej wersji javy.

0

To znowu ja. Tym razem mam taki problem: chciałbym pobrać kod strony http://whatismyip.com:

	InetSocketAddress socketAddress = new InetSocketAddress(new URL("http://whatismyip.com/").getHost(), 80);
	Socket socket = new Socket();
	socket.connect(socketAddress);
	
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        String request = "GET / HTTP/1.1\r\nUser-Agent: Opera/9.20 (Windows NT 5.0; U; pl)\r\nHost: whatismyip.com\r\n\r\n";
        writer.write(request);
        writer.flush();
	
	StringBuffer content = new StringBuffer();
	String line;
	BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	while ((line = reader.readLine()) != null)
	  content.append(line).append("\n");
	String response = content.toString();
	System.out.println(response);

Niestety za każdym razem pojawia się błąd:
java.net.SocketException: Connection reset
A wygląda to tak, że wykonywanie programu dochodzi do pętli odczytującej kolejne linie, czyta zawartośc do końca (wiem bo sprawdzałem podczas debuggowania, po zatym w snifferze wszystko się ładnie pobiera), po czym program się zamraża na około 2 minuty, bu potem wyrzucić powyższy wyjątek. Dodam tylko, że whatismyip.com nie jest niestety jedyną stroną przez którą mam ten problem. Choć są strony, które się dobrze pobierają.
Co może powodować ten błąd?

Dzięki za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1