- 为什么会发生粘包和拆包的问题?
- 操作系统在发送TCP消息数据的时候,底层会有一个缓冲区。这个缓冲区会有一个大小size。当一个请求的数据量没有达到size的时候,系统会把多个请求的数据合并发送,此为粘包;当一个请求的数据量超过size的时候,系统会把这个数据量大的请求的数据拆成多个数据包来发送,此为拆包。
- netty是如何解决粘包和拆包的?
- 客户端在每次发送数据包的时候,大小固定为缓冲区大小size。如果不足size,用空格来凑。如果要发送的数据大于缓冲区大小怎么办?分多次发送。netty中提供了
FixedLengthFrameDecoder
这个类来处理固定大小数据包的粘包和拆包问题。 - 客户端在每个包的结尾用特殊的分隔符来标识一个完整的数据包的结束,比如\r\n。读到特殊的分隔符即得到一次完整的数据包。netty中提供了
LineBasedFrameDecoder
和DelimiterBasedFrameDecoder
来支持这种方式。 - 消息分为消息头和消息体。在消息头中记录一次消息数据的长度。读够记录的长度即得到一次完整的数据包。netty中提供了
LengthFieldBasedFrameDecoder
和LengthFieldPrepender
来支持这种方式。 - 自定义协议来处理粘包和拆包问题。netty中可以通过继承
LengthFieldBasedFrameDecoder
和LengthFieldPrepender
或者是通过实现MessageToByteEncoder
和ByteToMessageDecoder
来支持这种方式。
- netty有哪些特征?
- 异步的,事件驱动的网络通信框架。
- 同步和阻塞有什么区别?
- 同步指的是两个对象之间的关系;而阻塞指的是一个对象的状态。
- 同步与异步是针对被调用者说的;阻塞和非阻塞是针对调用者说的。
- 同步:A调用B,B执行完了有结果了再返回。
- 异步:A调用B,立即返回,不用等待,当B处理完之后会通过事件通知的方式或者是回调函数的方式来告诉A结果。
- 阻塞:A调用B,A会被挂起,一直等待B的结果,直到得到B的返回结果,A才能继续执行。
- 非阻塞:A调用B,A不用被挂起,A可以继续去做其他的事情,等B返回结果再处理返回的消息数据。
- http请求中的put方式和patch方式有什么区别?
- put:修改,传参是修改后的全量数据
- patch:修改,修改哪个字段,传哪个字段。