while(true) {
// selama _input masih ObjectInputStream, coba looping lagi
// Kalau Disconnect dipanggil, _input akan jadi null
// maka while ini jadi break
if (_input instanceof ObjectInputStream) {
int readcount = 0;
while(true) {
// coba ambil data di sini , loop terus sampe break
// kondisi terus, kalau readcount = buf.length, artinya bisa ambil data banyak
// mungkin masih ada data lagi setelahnya
//
// kondisi break, kalau readcount < buf.length, artinya buffernya aja gak sampe penuh
// berarti datanya cuma dikit
byte[] buf = new byte[1024];
try {
readcount = _input.read(buf); // ngeblok di sini
} catch (IOException e) {
raise_log_error("IOException from input.read", e);
break;
}
if (readcount>0) { // perlu disimpen apa nggak
if (readcount>bytebuf.remaining()) {
// gak cukup, gedein byte buffer
ByteBuffer newbytebuf = ByteBuffer.allocate(bytebuf.capacity()+readcount);
newbytebuf.put(bytebuf);
bytebuf = newbytebuf; // alokasikan ke sini
}
// sampe sini , size cukup
bytebuf.put(buf,0,readcount);
// kalau readcount = 1024, artinya datanya cukup banyak, mungkin perlu baca lagi
// kalau readcount < 1024, artinya datanya sedikit, cukup sekali baca aja
if (readcount!=buf.length) break;
};
}
if (bytebuf.position()>0) {
bytebuf.flip();
byte[] totalbytes = new byte[bytebuf.remaining()];
bytebuf.get(totalbytes);
printbytes("TotalBytes",totalbytes);
try {
Object rxobject = _converter.ReadObject(totalbytes);
BA.Log("_converter.ReadObject success");
Map rxmap = (Map) rxobject;
BA.Log("Casting to Map success");
raise_newmapdata(rxmap);
BA.Log("raise_newmapdata complete");
} catch (IOException e) {
raise_log_error("IOException on converter.ReadObject",e);
} catch(ClassCastException e) {
raise_log_error("ClassCastException on converter.ReadObject",e);
}
// bersihin
bytebuf.clear();
}