Jeg har en server der servicerer en række klienter. For hver klient
registrerer jeg en SocketChannel for både READ og WRITE i en Selector:
public void registerClient(Client c, SocketChannel sc) throws
ClosedChannelException {
sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE, c);
}
Jeg lytter på Selector'en med koden:
int keysAdded = 0;
while ((keysAdded = selector.select(WAIT_TIME)) > 0) {
Set readyKeys = selector.selectedKeys();
Iterator i = readyKeys.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey)i.next();
i.remove();
if (key.isReadable()) {
...
} else if (key.isWritable()) {
...
}
}
}
Når nu en SocketChannel er klar til at blive læst fra er det jo nemt, man
læser blot til en ByteBuffer og gør hvad man ellers vil. Mit problem er, når
nu en anden tråd i min server skal sende til en given klient. Hvordan gør
jeg en SocketChannel "writable", for der skal jo først skrives med
SocketChannel.write(ByteBuffer), når Selector'en siger at en SocketChannel
er writable, eller hvordan foregår det? Håber problemet er forståeligt.
|