/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Forsøg på at bruge selector
Fra : Jacob Jensen


Dato : 22-10-05 12:14

I forlængelse af tråden "Bufferedreader.ready()"

Nu har jeg forsøgt at bruge selectors til at lytte på hvilke sockets der er
klar til at blive læst. Jeg gør følgende:

Først har jeg en ServerSocketChannel med navnet "channel" og udfører
følgende efter at have sat den til non-blocking:

SocketChannel socketChannel = channel.accept();

Hvis socketChannel er forskellig fra null gør jeg følgende:

socketChannel.configureBlocking(false);
socketChannel.register(sel, SelectionKey.OP_READ);

Hvis jeg ikke sætter blocking mode til false, giver "register" in
illegalBlockingModeException. Det forstår jeg ikke helt hvorfor. Nu opretter
jeg en ny instans af en klasse som skal varetage denne socketChannel's
socket (ikke i en ny tråd).

Lidt efter udfører jeg følgende:

Set keySet = null;
try
{
sel.selectNow();
keySet = sel.selectedKeys();
}
catch(Exception e)
{
System.out.println(e);
return false;
}

if(keySet.contains(clients[i].socketChannel.keyFor(sel)))
{
String command = clients[i].getCommand();
...

....hvor clients[i] er den instans jeg omtalte før og socketChannel er den
der blev returneret ved "accept()". Alt dette virker fint, men inde i
getCommand-funktionen går det galt. Efter en...

in = new BufferedReader(new
InputStreamReader(socketChannel.socket().getInputStream()));

....giver følgende en illegalBlockingModeException:

line = in.readLine();

Hvad gør jeg galt? Hvorfor skal socketChannel være i non-blocking mode når
jeg kalder "register()"?Jeg kan ikke finde noget der kan hjælpe mig på
java.sun.dom/docs

Jacob



 
 
Jacob Jensen (23-10-2005)
Kommentar
Fra : Jacob Jensen


Dato : 23-10-05 16:33

Fejlen er fundet.

Jeg kan ikke lave read på en InputStream fra en socket som haren tilknyttet
Channel, fordi socket'en delegerer al sin IO til kanalen. Tak for hjælpen.

Jacob



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste