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.