/
Forside
/
Teknologi
/
Udvikling
/
Java
/
Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn
*
Kodeord
*
Husk mig
Brugerservice
Kom godt i gang
Bliv medlem
Seneste indlæg
Find en bruger
Stil et spørgsmål
Skriv et tip
Fortæl en ven
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 :
177558
Tips :
31968
Nyheder :
719565
Indlæg :
6408924
Brugere :
218888
Månedens bedste
Årets bedste
Sidste års bedste
Copyright © 2000-2024 kandu.dk. Alle rettigheder forbeholdes.