Avatar billede dsj Nybegynder
26. juni 2003 - 01:06 Der er 1 løsning

NIO: problem med read fra SocketChannel til ByteBuffer

Jeg har en server der gør anvendelse af  multiplexed, non-blocking I/O med java.nio. Når klienter connecter venter serveren på beskeden: <system cmd="knock"/>, returnerer en besked og disconncter klienten. Klienten serviceres kort på under et sekund.

Men i 20% af tilfældene modtager serveren aldrig noget fra klienterne - også selvom de med garanti har sendt. Eller med andre ord: serveren modtager og data bliver placeret i en ByteBuffer - SocketChannel.read(ByteBuffer) - men et kald til ByteBuffer.remaing() returnerer 0 !!

ByteBuffer receiveBuf = ByteBuffer.allocate(65536);
receiveBuf.clear(); // koden anvendes andre steder til længere levende klienter
int readBytes = channel.read(receiveBuf);
receiveBuf.flip();
StringBuffer sb = new StringBuffer();
System.out.println(" * Remaining: "+receiveBuf.remaining()); // skriver: ' * Remaining: 0'
System.out.println(" * Received: "+new String(receiveBuf.array())); // skriver: ' * Received: <system cmd="knock"/>'
while(receiveBuf.remaining() >= 2) {
  byte b = receiveBuf.get();
  sb.append((char)b);
}
System.out.println(" * sb content: "+sb.toString()); // writes: ' * sb content: '

ByteBuffer'en modtager klart de korrekte data, men ByteBuffer.remaining() returnerer 0 og derfor får StringBuffer'en ikke fyldt noget i sig.

Problemet forekommer tilfældigt, nogen gange mange gange i træk og andre gange med lange intervaller, men stadig i 20% af tilfældene. Klienterne køres simuleret fra samme PC

Nogen der ved hvad der lige går galt her, og hvordan problemet løses?

Jeg har prøvet at fjerne linien - receiveBuf.clear(); - hvilket resulterer i at ByteBuffer.remaining() IKKE returnerer 0, men over. Fejlen forekommer ligeså ofte og består i så fald i, at det sidste tegn i modtagede data mangler: <system cmd="knock"/
Avatar billede dsj Nybegynder
02. juli 2003 - 00:15 #1
Lukker - der er åbenbart næsten ingen der har et dybere kendskab til NIO...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester