一.Netty
1.netty是一个异步的、基于事件驱动的网络应用框架。快速开发高性能、高可靠的网络IO程序。
二.NIO和BIO的比较
1.BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O的效率高很多
2.BIO是阻塞的,NIO是非阻塞的
3.BIO基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
Selector(选择器)用于监听多个通道的事件,(比如:连接请求、数据到达等),因此使用单个线程就可以监听多个客户端通道。
三.Selector、Channel和Buffer的关系图
关系图说明
1.每个Channel都会对应一个Buffer
2.Selector对应一个线程,一个线程对应对个Channel(连接)
3.该图反应了3个Channel注册到该Selector //程序
4.程序切换到哪个Channel是有事件决定的,Event就是一个重要的概念
5.Selector会根据不同的事件,在各个管道上切换
6.Buffer就是一个内存块,底层是有一个数组
7.数据的读写是通过Buffer,这个BIO要么是输入流,要么是输出流,不能双向,但是NIO的Buffer是可以读也可以写,NIO需要filp方法切换
8.Channel是双向的,可以返回底层操作系统的情况,比如Linux,底层的操作系统通道就是双向的
四.JDK7中 Files--walkFileTree 删除多级目录
Files.walkFileTree(Paths.get("D:\\"), new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//先进入目录里去删文件
Files.delete(file);
return super.visitFile(file,attrs);
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
//再删除目录
Files.delete(dir);
return super.postVisitDirectory(dir, exc);
}
});
注:删除目录时,目录里有文件不可删除,必须先删除文件。
五.NIO非阻塞--网络原理分析图
说明:
1.当客户端连接时,会通过ServerSocketChannel得到SocketChannel。
2.将socketChannel注册到Selector上,通过register(Selector selector,int ops)方法,一个selector上可以注册多个SocketChannel。
3.注册后返回一个SelectionKey,会和该Selector关联(集合)。
4.Selector进行监听select方法,返回有时间发生的通道个数,如果没有事件,则会进行阻塞。
5.进一步得到各个SelectionKey(有事件发生的通道的个数)。
6.在通过SelectionKey反向获取SocketChannel,使用方法channel()。
7.可以通过得到的channel完成业务处理。