Netty + ProtoBuffer:一个连接的几个通信消息

2022-09-03 02:27:05

在阅读Netty教程时,我发现了如何集成Netty和Google协议缓冲区的简单描述。我已经开始研究它的示例(因为文档中没有更多信息),并编写了一个简单的应用程序,如示例本地时间应用程序。但是这个例子在PipeFactory Class中使用静态初始化,例如:

import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.codec.protobuf.ProtobufDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufEncoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;

import static org.jboss.netty.channel.Channels.pipeline;

/**
 * @author sergiizagriichuk
 */
class ProtoCommunicationClientPipeFactory implements ChannelPipelineFactory {

    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline p = pipeline();
        p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
        p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));

        p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
        p.addLast("protobufEncoder", new ProtobufEncoder());

        p.addLast("handler", new ProtoCommunicationClientHandler());
        return p;
    }

}

(请看一下行)并且只能为类创建一个工厂(据我所知),我的意思是方法。因此,在这种情况下,我可以使用条消息发送到服务器,并使用条消息从服务器接收,这对我不利,我认为不仅对我来说:(如何仅对一个连接使用不同的消息?也许我可以创建一些这样的p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));ClientBootstrapbootstrap.setPipelineFactory()protobufDecoder

p.addLast("protobufDecoder", new ProtobufDecoder(Communication.DataMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.TestMessage.getDefaultInstance()));
p.addLast("protobufDecoder", new ProtobufDecoder(Communication.SrcMessage.getDefaultInstance()));

还是其他技术?多谢。


答案 1

我在谷歌群组中找到了netty作者的线程,并明白我必须改变我的架构或编写我自己的解码器,就像我上面写的那样,所以,开始思考什么方法会容易和更好。


答案 2

如果您无论如何都要编写自己的编解码器,则可能需要考虑为自定义数据对象实现可外部化接口。

  • 可序列化是低工作量,但性能最差(序列化所有内容)。
  • Protobuf 是努力和性能之间的良好权衡(需要 .proto 维护)
  • 可外部化是高工作量,但最佳性能(自定义最小编解码器)

如果你已经知道你的项目必须像山羊一样扩展,你可能不得不走一条艰难的道路。Protobuf不是银弹。


推荐