package net.test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
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.util.Iterator;
import java.util.Set;
public class NIOServer {
public static void main(String[] args) throws IOException {
// 负责处理客户端连接的selector
Selector serverSelector = Selector.open();
// 负责读写数据的selector
Selector clientSelector = Selector.open();
new Thread(() -> {
try {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
// 绑定端口8001
serverSocketChannel.socket().bind(new InetSocketAddress(8000));
// 开启NIO配置
serverSocketChannel.configureBlocking(false);
// 将severSocketChannel绑定到serverSelector,并且selector监听新建连接的事件请求
serverSocketChannel.register(serverSelector, SelectionKey.OP_ACCEPT);
while (true) {
if (serverSelector.select(1) > 0) {
System.out.println("serverSelector.select() ... ");
Set<SelectionKey> selectionKeys = serverSelector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isAcceptable()) {
try {
ServerSocketChannel channel = (ServerSocketChannel) selectionKey.channel();
SocketChannel socketChannel = channel.accept();
socketChannel.configureBlocking(false);
// 将处理连接读写请求的通道注册到clientSelector
socketChannel.register(clientSelector, SelectionKey.OP_READ);
} finally {
iterator.remove();
}
}
}
}
}
} catch (Exception e) {
}
}).start();
new Thread(() -> {
try {
while (true) {
if (clientSelector.select(1) > 0) {
System.out.println("clientSelector.select() ... ");
Set<SelectionKey> selectionKeys = clientSelector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isReadable()) {
try {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
socketChannel.read(byteBuffer);
byteBuffer.flip();
System.out.println(Charset.defaultCharset().newDecoder().decode(byteBuffer)
.toString());
} finally {
iterator.remove();
selectionKey.interestOps(SelectionKey.OP_READ);
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}