第一个要素为长连接,一个长连接可以发送多个消息
第二个要素为缓冲区。当我们采用了缓冲区以后,缓冲区会有固定大小,当发送的数据和缓冲区的大小不一致时,就会发生粘包和拆包。我们可以理解为:当缓冲区的大小被装满时,才会写入到硬盘
提到粘包与拆包,我们需要先做一些铺垫,了解一下缓冲区的作用
我们先来看一张图解:
Client发送数据,如果没有缓冲区,采用的是IO流。IO流传输是按照字节进行传输的,效率极低。当我们改为缓冲区以后,我们可以把消息存到一起,一并发送
比如说:“今天你过的还好吗”这样一组字符串要传输8次,效率就很低,所以,我们采用Buffer缓冲区进行传输,统一放入缓冲区内,再一次性写入。效率就提高了
粘包:
我们第一次发送的数据只有512,不够缓冲区大小,所以缓冲区不会进行写入操作,当我们发送第二次数据又有512,两次加起来刚好满足缓冲区大小,则进行写入操作。即为粘包操作
当我们发送的数据大于缓冲区的大小,缓冲区装不下了,所以会分成两次写入,所以,拆包也就随之发生了
ch.pipeline().addLast(new LineBasedFrameDecoder(1024));
ch.pipeline().addLast(new StringEncoder());