1、为什么我们会选择netty而不是java原生api
nio的java原生api使用起来比较繁琐ServerSocketChannel,SocktChannel,ByteBuffer,selector,必须精通多线程与网络编程的人才能写出高质量的Nio程序;
netty是最流行的Nio框架,它的健壮性,功能、性能、可扩展性都是比较好的;
2、序列化与反序列化
序列化:把对象转换成字节的过程,称为对象序列化
反序列化:把字节恢复成对象的过程,称为反序列化
1.
对象的持久化概念:把字节保存的硬盘上永久的存放
2.
网络传输对象概念:客户端将对象序列化为字节(序列化),变成二进制的形式发送到服务器端端,服务器端接受到字节对象后,反序列化成对象
注意序列化的类必须要实现Serializable接口
transient修士变量不被序列化
json
MessagePack编码器
marshalling实现编码器
3、粘包与拆包
什么是粘包:多次发送的消息,客户端一次合并读取 msg+msg
什么是拆包:第一次完整消息+第二次部分消息组合
、第二次缺失的消息
Tcp协议为了高性能的传输,发送和接受的时候都采用了缓冲区
1.
当我们的应用程序发送的数据大于套字节缓冲区的时候,就会实现拆包。
2.
当我们的应用程序写入的数据小于套字节缓冲区的时候,多次发送的消息会合并到一起接受,这个过程我们可以称做为粘包。
3.
接受端不够及时的获取缓冲区的数据,也会产生粘包的问题
4.
进行mss(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>mss的时候将发生拆包。
解决思路:
1.以固定的长度发送数据,到缓冲区
2.可以在数据之间设置一些边界(\n或者\r\n)
利用编码器LineBaseDFrameDecoder解决tcp粘包的问题
4、nettyApi与netty实现dobbo
mayikt_netty_meite.zipmayikt_netty_nio_meite.zip
