RPC架构入门
传统的socket分析(BIO的阻塞问题)
- 阻塞点:sever.accept() ;inputStream.read();
- 单线程情况下只能有一个客户端
- 用线程池可以有多个客户端连接,但是非常消耗线程。
NIO的特点
- 单线程可以连接多个客户端
- 选择器可以实现但线程管理多个Channel,新建的通道都要向选择器注册
- 一个SelectionKey键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系。
- selector进行select()操作可能会产生阻塞,但是可以设置阻塞时间,并且可以用wakeup()唤醒selector,所以NIO是非阻塞IO
通道Channel
如果一个Channel类实现了ReadableByteChannel接口,则表示其是可读的,可以调用read()方法读取;
如果一个Channel类实现了WritableByteChannel接口,则表示其是可写的,可以调用write()方法写入;
如果一个Channel类同时实现了ReadableByteChannel接口和WritableByteChannel接口则为双向通道,如果只实现其中一个,则为单向通道;
#创建FileChannel
RandomAccessFile raf = new RandomAccessFile ("somefile", "r");
FileChannel fc = raf.getChannel( );
#创建客户端通道
SocketChannel channel = SocketChannel.open();
channel.connect(new InetSocketAddress("http://xxx,com", 80));
#创建服务端通道
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(80));
#创建UDP包通道
DatagramChannel dc = DatagramChannel.open( );
一个通道通常有4个状态
SelectionKey.OP_CONNECT #连接就绪
SelectionKey.OP_ACCEPT #接受就绪
SelectionKey.OP_READ #读就绪
SelectionKey.OP_WRITE #写就绪
//绑定selector并给通道设置读的权限。
channel.register(this.selector, SelectionKey.OP_READ);