/
Forside
/
Teknologi
/
Udvikling
/
Java
/
Nyhedsindlæg
Login
Brugernavn
*
Kodeord
*
Husk mig
Brugerservice
Kom godt i gang
Bliv medlem
Seneste indlæg
Stil et spørgsmål
Skriv et tip
Pointsystemet
Kontakt Kandu.dk
Emnevisning
Kategorier
Alfabetisk
Karriere
Interesser
Teknologi
Reklame
Top 10 brugere
Java
#
Navn
Point
1
molokyle
3688
2
Klaudi
855
3
strarup
740
4
Forvirret
660
5
gøgeungen
500
6
Teil
373
7
Stouenberg
360
8
vnc
360
9
pmbruun
341
10
mccracken
320
NIO: problem med read fra SocketChannel ti~
Fra :
Daniel Jacobsen
Dato :
26-06-03 14:36
Hej
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"/
// Daniel
Søg
Alle emner
Teknologi
Udvikling
Java
Indstillinger
Spørgsmål
Tips
Usenet
Reklame
Statistik
Spørgsmål :
177821
Tips :
31980
Nyheder :
719565
Indlæg :
6410976
Brugere :
218912
Månedens bedste
Årets bedste
Sidste års bedste
Copyright © 2000-2026 kandu.dk. Alle rettigheder forbeholdes.