netty概要
netty是一个异步非阻塞的通信框架(类似的框架还有mina,grizzly)。
底层封装了NIO2.0模块,即AIO。
好处:使用起来无需关注如何连接,只需关注业务逻辑处理代码,而且性能高效。遵循servlet3.0标准规范的,和tomcat等web容器不同的是异步非阻塞。tomcat容器支持最大并发量大概在800左右。而且netty也不算是web容器。
使用流程:
服务端:配置端口,长连接还是短连接(针对业务,比如聊天一般用长连接,和客户端保持连接,短连接是针对是数据量大连接次数少的情况,比如一小时上传文件4到5次),最后要调用下异步关闭,否则服务端会关闭的,一般我们是不允许服务端关闭的。
应用场景:作为路由网关、文件上传和下载,消息通信,心跳检测等。
拆包粘包问题:设置定长(一次只能传输200K以下的数据,小于200k的后面以空格补全)、设置特殊分割符(编解码)、自定义协议(实现编解码的接口,进行扩展而已)。
编解码(序列化):传输数据如果为对象,实体类必须要实现serialable接口,但java序列化码流大,传输慢,性能低。可以使用joss框架Marshalling+压缩解压缩这样的方式实现。
业务问题:
1、若客户端和服务端为短连接,规定时间内(比如5秒)不传输数据默认断开,如何实现?
调用readTimeoutHandler(5)。
2、若客户端和服务端断开连接后,客户端再次发送请求,如何才能保证服务端接收到数据?
在客户端初始化的时候,判断下客户端是否服务端保持连接,如果没有,重新连接下。
摘自:https://github.com/ouzhrm/netty_study/blob/master/README.md
组件
ByteBuf
Channel 和 Unsafe
OioServerSocketChannel 和 OioSocketChannel
NioServerSocketChannel 和 NioSocketChannel
ChannelPipeline 和 ChannelHandler
Future 和 Promise
EventLoop 和 EventLoopGroup
ServerBootstrap 和 Bootstrap
启动类
Encode 和 Decoder
协议~