Netty在ChannelPipeline内的数据表示?

时间:2015-09-02 23:19:50

标签: java netty

我正在学习 Netty框架。据我所知,它大致围绕两个组件构建,ByteBuffer(用于低级数据表示)和Channel(用于在线路中传输ByteBuffers)。我正在查看捆绑它的Netty示例(Netty 3.2)。我参加了下面给出的简单Telnet计划。在这里,我不太了解管道的顺序,其中进入ChannelPipeline的数据首先被解码并再次编码,然后转发到处理程序,这意味着(Channel) ChannelPipeline内的数据类型是二进制(纠正我,如果我错了),但我认为它将是 text 。在Channel (ChannelPipeline)内使用二进制而不是 text 表示的原因是什么?

package org.jboss.netty.example.telnet; 

public class TelnetServerPipelineFactory implements
    ChannelPipelineFactory {

public ChannelPipeline getPipeline() throws Exception {
    // Create a default pipeline implementation.
    ChannelPipeline pipeline = Channel.pipeline();

    // Add the text line codec combination first,
    pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
            8192, Delimiters.lineDelimiter()));
    pipeline.addLast("decoder", new StringDecoder());
    pipeline.addLast("encoder", new StringEncoder());

    // and then business logic.
    pipeline.addLast("handler", new TelnetServerHandler());

    return pipeline;
 }
}

2 个答案:

答案 0 :(得分:2)

起初这似乎令人困惑。传递给管道的消息的正常路径应如下所示。

  1. 消息以字节流的形式到达套接字。
  2. 它们由StringDecoder解码,因此字节流转换为String。
  3. 将字符串传递给TelnetServerHandler,然后您可以随意使用它。
  4. 那么编码器在哪里发挥作用? 为什么它甚至出现在管道中,而且在TelnetServerHandler 之前呢?它不会将String编码回字节流吗?

    所以基本上在Netty中,处理程序有两种类型。它们可以是下游处理程序或上游处理程序,甚至可以是两者。 基本上下游是指管道正在向远程发送内容。上游就是从远程读取内容的时候。因此,解码器是上游处理程序,它们将拦截来自远程即外部的数据。

    编码器是下游处理程序,它们拦截服务器发送到远程的数据。因此,如果您想从TelnetServerHandler向外部世界(即您的客户端)发送一个字符串,那么String将由StringEncoder编码为ByteBuf。

    希望这可以解除你的疑虑。

答案 1 :(得分:1)

通常,解码器只处理传入的消息。他们延长$contact->load_relationship("accounts"); $contact->accounts->delete($contact->id, $account->id); 。除了调用管道中的下一个处理程序之外,编码器不会对传入消息执行任何操作。您将ChannelInboundHandlerAdapter中有String

现在,如果此处理程序将发送消息,它将被编码(编码器扩展TelnetServerHandler并在某一时刻覆盖ChannelOutboundHandlerAdapter方法)并且write()将被发送到连接的对等方。 解码器不会对传出消息执行任何操作。它的ByteBuf方法只调用下一个处理程序。