前言:最近维护一个项目,用到了netty框架,学习java断断续续有了大半年了,没怎么学习过java框架,所以准备去学习netty框架,其中有网上的总结和自己的理解,有错的地方,请多多指教。
netty是基于java nio来写的java开源框架,可以用来开发高性能,高并发的阻塞或者非阻塞网络应用程序,包括客户端和服务器。了解一点nio可以更好的理解netty框架。
java nio是new io的简称,与io比较的话,io是面向流的,是阻塞的,而nio是面向缓冲的,是非阻塞的。nio核心的部分是channel(通道),buffer(缓冲),selector(选择器)
面向流与面向缓冲
一般的io都是面向流的,除了udp操作,为什么这么说呢, 大家可以去看一下http://blog.csdn.net/kelindame/article/details/44759791,可以有个大概的印象。面向流的话,意味 着每次从流中读数据时,可以读一个或者多个字节,直到读完。写数据的话是直接写到流中。面向缓冲的话,是通过通道将数据读到一个缓冲区,然后线程从缓冲去读取数据。写数据时,线程将数据写到缓冲区,然后在从缓冲区写到通道中。这样做的好处是在处理数据时,数据在缓冲区中可以前后移动,提高了灵活性。
阻塞与非阻塞
io阻塞,意味着当线程去调用read()或者write()函数时,该线程被阻塞,直到写完数据或者有数据可以读,在等待读数据或者写数据期间,该线程不能干任何事情。nio非阻塞模式是说线程通过通道读取数据时,可以读取缓冲区现在拥有的数据,假如没有数据的话,就什么都不做,或者干其他事情,而不会被阻塞。写数据也是一样,线程将数据写入通道时,不需要等待它完全写入,同时可以去干别的事情。
selector可以更好的提高非阻塞的效率。它的作用就是管理多个通道。首先是多个通道注册到selector中,然后线程通过selector看哪个空闲的channel可以写入或者要读取的有数据的channel。
上面只是了解nio,以帮助我理解netty,假如要深入理解java nio的话,可以看Java NIO系列教程