Giriş
Şu satırı dahil ederiz.
attach metodu
Ş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.
SelectableChannel döndürür. Eğer isAcceptable() true dönerse şöyle yaparız.
isConnectable metodu
Şöyle yaparız.
isReadable metodu
Şöyle yaparız.
Şöyle yaparız.
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 metoduSelectableChannel 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ızif (key.isConnectable()) {
SocketChannel sc = (SocketChannel) key.channel();
...
}
Eğer isReadable true dönerse şöyle yaparızif (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
...
}
Eğer isWritable true dönerse şöyle yaparızif (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
Şöyle yaparız.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 metoduSelectionKey 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