Java by API/java.nio.channels/SelectableChannel
Версия от 17:43, 31 мая 2010; (обсуждение)
SelectableChannel: register(Selector sel, int ops)
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));
}
}
}
}
}
}