关于netty

netty与我的境遇发生在给别人写课设之中!!!

听起来是不是很意外,那是一个夜黑风高的夜晚,外面下着大雨,皎洁的夜光照在我的脸上,此时一名joker正在看这篇博客……………(皮一下🤭)

netty官方源码(例子及用法说明一应俱全):https://netty.io/wiki/index.html

netty在github的源码地址:https://github.com/netty/netty

netty是我第一次关于服务器方面的应用开发的学习,虽然学校并没又这一门课,但是感觉还是蛮重要的而且很有趣就试着自学一下。

netty是什么

netty是一个异步的,事件驱动的网络编程框架。

netty是一个基于NIO(非阻塞IO)开发的网络通信框架。既然说到了NIO就提一下BIO(阻塞IO)。

NIO,同步非阻塞IO,阻塞业务处理但不阻塞数据接收,适用于高并发且处理简单的场景,比如聊天软件。

BIO,同步阻塞IO,阻塞整个步骤,如果连接少,他的延迟是最低的,因为一个线程只处理一个连接,适用于少连接且延迟低的场景,比如说数据库连接。

两种I/O模型的对比:

可以清楚的看到NIO在处理单线程的连接数量要比BIO高出很多。

netty与tomcat

netty与tomcat一样,都是基于java的web服务。两者最大的区别在与通信协议。tomcat是基于http协议的,而netty则可以通过编程自定义各种协议。而且,netty调用API及其简单容易。

netty的优势

1、并发高

2、传输快

3、封装好

​ 前面已经说过,netty是一款基于NIO开发的网络通信框架,NIO是多个Socket对一个Selector,而BIO是一个Socket对一个Selector,在处理连接数量上NIO要比BIO高出很多,这也是为什么netty的并发性高的原因。

​ 其次,netty依赖了NIO”零拷贝“特性,当他需要接收数据的时候,他会在堆内存之外开辟一块内存,数据就直接从IO读到了那块内存中去,在netty里面通过ByteBuf可以直接对这些数据进行直接操作,从而加快了传输速度。Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。

​ Netty封装了NIO操作的很多细节,提供易于使用的API。

根据源码测试echo和http-helloworld:

echo:

helloworld:

源码已发布在gitee上,持续更新地址:https://gitee.com/tordan/study-netty