19 Ekim 2017 Perşembe

SelectionKey Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.nio.channels.SelectionKey;
Bu sınıf soyuttur (abstract) ve Selector ilgilidir.

attach metodu
Açıklaması şöyle
Attaches the given object to this key. An attached object may later be retrieved via the attachment method. Only one object may be attached at a time; invoking this method causes any previous attachment to be discarded. The current attachment may be discarded by attaching null."
Örnek
Şöyle yaparız
try {
  Selector selector = Selector.open();
  ServerSocketChannel serverSocket = ServerSocketChannel.open();
  serverSocket.bind(new InetSocketAddress("localhost", 10_000));  
  serverSocket.configureBlocking(false);

  HashMap<String, Object> attr = ...;

  SelectionKey selectionKey = serverSocket.register(selector, SelectionKey.OP_ACCEPT);
  // attach a object
  selectionKey.attach(attr);

  while (true) {
    selector.selectNow();
    Set<SelectionKey> selectionKeySet = selector.selectedKeys();
    Iterator<SelectionKey> iter = selectionKeySet.iterator();
    while (iter.hasNext()) {
      selectionKey = iter.next();
      // Get the attachment object again from selectionKey 
      HashMap attr = (HashMap)selectionKey.attachment();  
      if(selectionKey.isAcceptable()){
        ...
      }
      iter.remove();
    }
  }
}
catch(Exception e) {...}
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