Netty
Java NIO三大组件:Selector,Buffer,Channel
- 每个channel都对应一个Buffer
- Selector对应一个线程
- Buffer是一个内存块,底部有一个数组
Buffer
//标记
private int mark = -1;
//当前位置
private int position = 0;
//缓冲区的位置
private int limit;
//缓冲区的容量大小
private int capacity;
Selector
常用方法
//Open方法,返回一个选择器对象
public static Selector open();
//监控注册的通道,当有IO操作时,将对应的SelectionKey加入集合并返回
public abstract int selectNow()
//监控注册的通道,当有IO操作时,将对应的SelectionKey加入集合并返回,参数用来设置超时时间
public abstract int select(long timeout)
//查看所有SelectionKey
public abstract Set<SelectionKey> selectedKeys();
NIO的简单网络编程
服务端
package com.kklll.leetcode.nio.server;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
import java.util.Set;
/**
* @Author DeepBlue
* @Date 2020/10/11 15:25
*/
public class NioServer {
public static void main(String[] args) throws Exception {
//serverSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//先获取Socket然后绑定端口号
serverSocketChannel.socket().bind(new InetSocketAddress(6666));
//非阻塞
serverSocketChannel.configureBlocking(false);
//创建一个Selector
Selector selector = Selector.open();
//把ServerSocketChannel注册到Selector事件为Accept
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select(1000) == 0) {
System.out.println("我干别的去了");
continue;
}
//获取到Accept发生的集合
Set<SelectionKey> selectionKeys = selector.selectedKeys();
SelectionKey key1 = null;
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
key1 = iterator.next();
if (key1.isAcceptable()) {
SocketChannel accept = serverSocketChannel.accept();
accept.configureBlocking(false);
System.out.println("客户端连接成功!Channel的hashcode是:"+accept.hashCode());
//再注册,并关联一个Buffer
accept.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024));
}
if (key1.isReadable()) {
SocketChannel channel = (SocketChannel) key1.channel();
ByteBuffer buffer = (ByteBuffer) key1.attachment();
channel.read(buffer);
System.out.println("客户端发送的是:" + new String(buffer.array()));
buffer.clear();
channel.close();
}
iterator.remove();
}
}
}
}
客户端
package com.kklll.leetcode.nio.client;
import java.io.IOException