Netty如何确定读取操作何时完成?

8
以下是一个回显服务器的ChannelHandler

enter image description here

Netty框架将调用channelReadComplete()方法通知处理程序,最后一次调用channelRead()是当前批次中的最后一条消息。
我的问题是,由于数据是以块的形式在线传输的,Netty如何知道何时完成一批消息
1个回答

12

channelReadComplete()会在底层传输没有更多数据可读时触发。当谈到SocketChannels时,可能有以下两种情况之一:

  1. read(...)返回0
  2. read(...)被传递了一个要填充1024字节的缓冲区,但填充的字节数小于1024。

1
谢谢。这些明确的规则比一些高层次的模糊描述更好。 - smwikipedia
我认为channelReadComplete()也会被Channel.read()触发,即使底层传输中仍有更多数据需要读取。@Norman,这个想法正确吗?如果是的话,这种行为背后的原因是什么?谢谢! - Aaron Feldman
是的,没错... channelReadComplete() 只是表示在当前事件循环运行中不会再有 Channel 的读取。所以你可以立即进行刷新操作。 - Norman Maurer
@NormanMaurer 这很令人困惑,因为 socketChannel 读取长度返回 0 并不意味着没有更多可读的内容,而返回 -1 则表示没有了。如何处理返回值为 -1? - zipper
负数表示文件结束。 - Norman Maurer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接