Zdravim pani!
Pri vyvoji mojej novej aplikacie som narazil na zaujimavy problem v jave
na Windows masinach.
Celu vec som odladoval pod linuxom, dole mam C aplikaciu beziacu na
routerboarde pod openWRT a ako konfiguracny soft je aplikacia pod
netbeans platform cez, ktoru sa ten spodok konfiguruje.
Ako protokol pouzivam jemne upravene Cckove XDR. Pridal som este pre
istotu kontrolu CRC prenasanych dat.
Vsetko fungovalo bez problemov aj vo Windows co mam vo virtual boxe pod
linuxom.
Ked som zacal ostre testy na masinach kolegov tak som zistil, ze mam
problem.
Na Windows masinach nahodne vznikal "End of stream exception" Tak
nasledoval wireshark a kontrola paketov. Samozrejme vsetko bolo OK.
Kontrola kodu bola tiez ok.
Padalo to v tomto kode vzdy na inom mieste: (predtym poslem Ccku cez
outputstream prikaz na odoslanie XDR dat)
int id = inputStream.read() & 0xff;
int x1 = inputStream.read() & 0xff;
int x2 = inputStream.read() & 0xff;
int x3 = inputStream.read() & 0xff;
int c1= inputStream.read() & 0xff;
int c2= inputStream.read() & 0xff;
int c3= inputStream.read() & 0xff;
int c4= inputStream.read() & 0xff;
Tak som skusil pridat pred ten kod toto:
while (inputStream.available()<8);
A problem bol odstraneny.
Este ma napadla vec, ze skusim zmerat cas kolko tam kod caka, plus som
pridal timeout:
long start=System.currentTimeMillis();
while (inputStream.available()<8) {
if((System.currentTimeMillis()-start)>3000){
break;
}
}
long end = (System.currentTimeMillis()-start);
if(maxWait<end){
maxWait = end;
System.out.println(">max Head Wait:"+maxWait);
}
A fcul to najlepsie:
Ubuntu 64bit maximalne 35ms
Ubuntu 64bit virtual box Windows XP 32bit max. 35ms
Windows XP 32bit komplet updaty max. 250ms
Windows XP 32bit bez updatov max. 230ms
Windows XP 64bit komplet updaty max. 210ms
Este sa to chystam otestovat na win7.
Z tohoto mi vychadza ze TCP sockety v jave su OK. Chyba je podla tohoto
niekde na urovni network driverov vo windows. Asi tam je nejaky timeout.
Protoze na Woknach pod virtualboxom to bezi bez problemov.
Jo a este moje nastavenia socketu, ale skusal som zmenit uz asi fsetko ;)
socket.setSoTimeout(5000);
socket.setKeepAlive(true);
socket.setTcpNoDelay(true);
Arsi