Java by API/java.nio.channels/Selector

Материал из Java эксперт
Перейти к: навигация, поиск

Selector: selectedKeys()

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.util.Iterator;
import java.util.Set;
public class MainClass {
  public static void main(String[] args) throws IOException {
    Charset charset = Charset.forName("ISO-8859-1");
    CharsetEncoder encoder = charset.newEncoder();
    CharsetDecoder decoder = charset.newDecoder();
    ByteBuffer buffer = ByteBuffer.allocate(512);
    Selector selector = Selector.open();
    ServerSocketChannel server = ServerSocketChannel.open();
    server.socket().bind(new java.net.InetSocketAddress(8000));
    server.configureBlocking(false);
    SelectionKey serverkey = server.register(selector, SelectionKey.OP_ACCEPT);
    for (;;) {
      selector.select();
      Set keys = selector.selectedKeys();
      for (Iterator i = keys.iterator(); i.hasNext();) {
        SelectionKey key = (SelectionKey) i.next();
        i.remove();
        if (key == serverkey) {
          if (key.isAcceptable()) {
            SocketChannel client = server.accept();
            client.configureBlocking(false);
            SelectionKey clientkey = client.register(selector, SelectionKey.OP_READ);
            clientkey.attach(new Integer(0));
          }
        } else {
          SocketChannel client = (SocketChannel) key.channel();
          if (!key.isReadable())
            continue;
          int bytesread = client.read(buffer);
          if (bytesread == -1) {
            key.cancel();
            client.close();
            continue;
          }
          buffer.flip();
          String request = decoder.decode(buffer).toString();
          buffer.clear();
          if (request.trim().equals("quit")) {
            client.write(encoder.encode(CharBuffer.wrap("Bye.")));
            key.cancel();
            client.close();
          } else {
            int num = ((Integer) key.attachment()).intValue();
            String response = num + ": " + request.toUpperCase();
            client.write(encoder.encode(CharBuffer.wrap(response)));
            key.attach(new Integer(num + 1));
          }
        }
      }
    }
  }
}