jdk nio 服务器
引言
在学习netty之前咱们须要理解nio,于是我就想分享一下如何用jdk nio写一个服务
流程
步骤1:关上一个服务管道(Channel),并设置非阻塞模式
步骤2:创立服务
步骤3:关上一个多路复用器,并注册到Channel,对ACCEPT事件感兴趣
步骤4:轮询抉择多路复用器,针对不同的复用器进行相干的操作(读、写)
public class NoUseNettyNio {
public void serve(int port) throws IOException {
//关上一个ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//设置一个serverSocketChannel为不阻塞模式,即nio
serverSocketChannel.configureBlocking(false);
//通过serverSocketChannel获取serverSocket
ServerSocket serverSocket = serverSocketChannel.socket();
//创立一个server的网卡地址对象
InetSocketAddress address = new InetSocketAddress(port);
//为serverSocket绑定网卡地址
serverSocket.bind(address);
//关上一个selector(多路复用器)
Selector selector = Selector.open();
//将多路复用器注册到serverSocketChannel(管道)上
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//创立一个byteBuffer
ByteBuffer buffer = ByteBuffer.wrap(("HTTP/1.1 200 OK\r\n" +
" Content-Type: text/html;charset=UTF-8\r\n").getBytes(StandardCharsets.UTF_8));
for (; ; ) {
try {
//抉择一个通道,此办法是阻塞的,在有一个通道、线程中断或Selector的唤醒时,返回
selector.select();
} catch (IOException e) {
e.printStackTrace();
break;
}
//获取的一个selectKey汇合,该汇合只能删除不能增加,
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
try {
if (key.isAcceptable()) {
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE,buffer.duplicate());
System.out.println("Accepted connection from "+client);
}
if(key.isWritable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer attachment = (ByteBuffer) key.attachment();
while (buffer.hasRemaining()) {
System.out.println(attachment.toString());
if(client.write(attachment) == 0) {
break;
}
}
client.close();
}
} catch (IOException e) {
key.channel();
try {
key.channel().close();
} catch (IOException ex) {
}
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
NoUseNettyNio noUseNettyNio = new NoUseNettyNio();
noUseNettyNio.serve(8910);
}
}
发表回复