标签归档:NIO

Netty简明教程

在阅读了netty-4.0.0-final的源码以及参考了《Netty in Action v5 MEAP》这本书之后,决定写一篇文章记录这几天的心得体会,介绍下netty的相关知识。但并不会面面俱到地阐述每一个细节,只会记录一些个人认为非常重要的部分,比如其线程模型,关键组件,以及使用方法等。

一.Netty是什么?

Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。

以上这个定义来自百度百科,简单来说Netty就是一个服务器端的网络通信框架,用于处理网络请求,和你自己写一个简单的服务器没什么本质上的区别,只不过Netty做的更强大。因为它是一个基于网络IO的通信框架,不受限于网络协议,所以他的应用范围就很广。比[……]

继续阅读

对NIO的几点理解

一、基本概念
Blocking IO VS NonBlocking IO
阻塞IO:线程会一直等待/阻塞直到IO操作完成,比如准备读取10个字节的数据,但是现在只读了8个,那么当前线程会一直等下去,直到读取到剩下的2个字节的数据。这是普通IO的线程模型:
bio-png
非阻塞IO:在进行IO操作时线程并不会阻塞(等待),一次只读取能读取的数据,读完立刻返回,然后线程会去继续处理其他事情。等下次可读的时候被唤醒,再来读取数据。这是NIO的线程模型:
nio-png
因此在阻塞IO模式下,如果你要处理N个请求的话,就需要开启N个线程分别处理这些请求。因此最大的连接数取决于服务器能开出的最大线程数,虽然后期采用线程池的方式做了些优化,但总体而言性能并没有很大提升。而在非阻塞IO下只要一个线程就够了,不断的在各个连接之间切换,在某个连接有可用事件的时候通知主线程。
咋一看是不是很容易理解?但是对于NIO的工作模式我一直有个疑问:

主线程立即返回了,那读写数据的时候总得消耗线程吧?

其实真正的IO操作是内核线程,但上层也需要用户线程去调用。而且NIO所说的用户线程立刻返回并不是说不消耗线程,而[……]

继续阅读