19 Ekim 2017 Perşembe

SelectionKey Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.nio.channels.SelectionKey;
Bu sınıf ile Selector ilgilidir.

cancel metodu
Bu sınıf ile Selector arasındaki ilişkiyi koparmak istersek şöyle yaparız.
SelectionKey key = channel.register(mySelector,
    SelectionKey.OP_READ | SelectionKey.OP_WRITE);
...
key.cancel();
channel metodu
SelectableChannel döndürür. Eğer isAcceptable() true dönerse şöyle yaparız.
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
Eğer isConnectable true dönerse şöyle yaparız
if (key.isConnectable()) {
  SocketChannel sc = (SocketChannel) key.channel();
  ...
}
Eğer isReadable true dönerse şöyle yaparız
if (key.isReadable()) {
  SocketChannel sc = (SocketChannel) key.channel();
  ...
}
Eğer isWritable true dönerse şöyle yaparız
if (key.isWritable()) {
  SocketChannel sc = (SocketChannel) key.channel();
  ...
}
isAcceptable metodu
Şöyle yaparız.
if (key.isAcceptable()) {
  ...
} 
Sunucu socketimiz yeni bir bağlantı almıştır.

isConnectable metodu
Şöyle yaparız.
if (key.isConnectable()) {
  ...
} 
İstemci socketimiz bağlanmıştır.

isReadable metodu
Şöyle yaparız.
if (key.isReadable()) {
  ...
} 
Socketimize veri gelmiştir. Burada gıcık bir durum var. key.channel() ile doğru socket tipini elde edemiyoruz. Açıklaması şöyle
SelectionKey.channel() always returns a SelectableChannel. The assigned type of the channel is not really relevant at this point, so you'll have to cast it.
TCP istemcisi ise şöyle yaparız
SocketChannel sc = (SocketChannel) key.channel();
...
TCP istemcisinden okumak için şöyle yaparız. Hata varsa socket kapatılır.
if (sc.read(myByteBuffer) == -1) 
  close(key);
Kapatma işlemi şöyledir.
private void close(SelectionKey key) throws IOException {
  key.cancel();
  key.channel().close();
}
isValid metodu
Şöyle yaparız.
SelectionKey key = ...;

if (!key.isValid()) 
  continue;
isWritable metodu
Şöyle yaparız.
if (key.isWritable()) {
  ...
} 
Socketimiz yazmak için müsaittir.


Hiç yorum yok:

Yorum Gönder