Strumienie filtrowane - dziwny problem

0

Witam serdecznie. Piszę aktualnie program wykorzystujący protokół HTTP.
Poniższy kod odpowiedzilany jest za wysłanie żądanie do serwera: (działa dobrze)

OutputStream out =  socket.getOutputStream(); // socket to oczywiście obiekt klasy Socket
String request = this.getRequestString(); // request - żądanie HTTP
out.write(request.getBytes());

Można to było wysłać ładniejszym sposobem, używając chociażby strumienia buforowanego, ale chciałbym maksymalnie uprościć kod.
A teraz zmieńmy jedną linikę. Zamiast
OutputStream out = socket.getOutputStream();
napiszmy:
OutputStream out = new FilterOutputSream(socket.getOutputStream());
I co? i błąd:
java.net.SocketException: Connection reset
Potrafi ktoś to logicznie wytłumaczyć?

  • UPDATE *
    doSZEDŁem do bardzo ciekawych wniosków. Napisałem klasę rozszerzającą FilterOutputStream z własną metodą write:
    public void write(byte[] b, int off, int len) throws IOException
    {
        out.write(b, off, len);
    }

Powyższa metoda działa wspaniale, ale gdy tylko zmienię linikę 'out.write(b, off, len);' na:

        for (int i = 0; i < len; i++)
            out.write(b[i]);

wurzuca 'connecton reset'. I się pytam: gdzie tu jest błąd? Dwie instrukcje, które powinny robić to samo, jednak jedna z nich jest mimo wszystko błędna.

I jeszsze jedna sprawa. Poprawcie mnie jeśli się mylę, lecz wydaje mi się że programista piszący FilterInputStream popełnił błąd. Gdy chcę rozszerzyć tą klasę i zaimplementować własną metodę read(), to muszę także napisać metody read(byte[] b) oraz read(byte[] b, int off, int len), ponieważ domyślnie korzystają one z metody read() ze zmiennej 'in' w FilterInputStream. W FilterOutputStream takiego problemu nie ma. Chcąć napisać własną metodę write, implementuję tylko metodę write(int b).
Zresztą popatrzcie sami:
public void write(byte b[]) throws IOException {
write(b, 0, b.length); // fajnie, wywołuje lokalną metodę write(byte[], int, int) która wowołuję lokalną metodę write(int)
}

public int read(byte b[], int off, int len) throws IOException {
return <span style="color: red">in.</span>read(b, off, len); // zostaje wywołana metoda read(int) lecz z 'in'. Gdybym napisał własną metodę read(in), nie zostałaby ona wykonana... 
}
0

hmmm napisz o tym na forum sun'a. moze wiecej Ci wyjasnia te temat tego filtrowanego strumienia.

pozdrawiam

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