我正在学习 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;
}
}
答案 0 :(得分:2)
起初这似乎令人困惑。传递给管道的消息的正常路径应如下所示。
那么编码器在哪里发挥作用? 为什么它甚至出现在管道中,而且在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
方法只调用下一个处理程序。