Dobry den,
Reads some number znamena 1,2 az x.
Pouzivejte read(),
nebo upravte podminku while (bytesRead > 0); a pozorne ctete dokumentaci :-)
Podle me InputStream precte tolik bytu, kolik ma k dispozici, a to muze byt
i mene nez jaka je deklarovana velkost bufferu.
public int read(byte[] b)
throws IOException
Reads some number of bytes from the input stream and stores them into
the buffer array b. The number of bytes actually read is returned as an
integer. This method blocks until input data is available, end of file is
detected, or an exception is thrown.
S pozdravem Josefik
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Jozef Babjak
Sent: Thursday, March 13, 2008 1:06 PM
To: Java
Subject: Problem s citanim OutputStream-u spojenia s HTTP serverom.
Zdravim!
Moj program sa pripoji na HTTP server, posle mu HTTP/1.0 Request a
cita odpoved z OutputStream-u prislusneho Socket-u, plusminus takto:
public static RawHttpMessage read(final InputStream in) throws
IOException {
final Content content = new AggregatedContent();
int bytesRead;
do {
final byte[] buffer = new byte[CHUNK];
bytesRead = in.read(buffer);
if (bytesRead == -1) {
break;
} else {
content.addContent(new BasicContent(buffer,
bytesRead));
}
} while (bytesRead == CHUNK);
return new RawHttpMessage(content);
}
Toto funguje celkom uspokojivo pre vacsinu requestov. Niekedy, zial
dost casto, sa stane,
ze citanie sa ukonci skor, ako by sa malo, a to najma pri vacsom HTTP
Response, napr.
obrazku. Vyssej vrstve sa potom posle skrateny obsah, napr. HTTP
hlavicka bez tela,
cast obrazku a pod.
Po troche laborovania som nasiel nasledujuci workaround: zmensit CHUNK
pod hranicu,
na ktoru sa "oreze" odpoved, aby vzdy doslo aspon k dvom prechodom
slucky, A ZAROVEN
pridat na zaciatok do-while cyklus Thread.sleep() s nejakou hodnotou,
zvycajne od 50 do 100
milisekund. Pritom cim je pomalsie spojenie na cielovy server, resp.
cim pomalsie sa generuje
HTTP Response, tym musi byt CHUNK mensi (k orezaniu dojde skor) a sleep
dlhsi.
Z uvedeneho sa nuka vysvetlenie, ze metoda read(byte[]) sa neblokuje
do prichodnu dalsieho obsahu,
ale ak ziadny obsah nie je dostupny, jednoducho citanie ukonci. Vyssie
uvedeny kod by mal -- podla
mna -- precitat cely input stream az po dosiahnutie jeho konca (alebo
vyhodenia vynimky); v niektorych
pripadoch "orezaneho citania" sa vyssie v kode po volani uvedenej
citacej metody da zistit, ze volanie
in.available() pre zdanlivo precitany input stream vrati kladnu hodnotu.
Poradi mi niekto, ako citanie urobit inac, spolahlivejsie?
J.
--
Tato zprava byla prohledana na vyskyt viru
a nebezpecneho obsahu antivirovym systemem
MailScanner a zda se byt cista.
--
Tato zprava byla prohledana na vyskyt viru
a nebezpecneho obsahu antivirovym systemem
MailScanner a zda se byt cista.