4

我正在开发一个使用协议缓冲区作为序列化程序的应用程序。我的应用程序将是服务器的客户端。要求是在发送 protobuf 数据之前,我必须在 protobuf 数据的大小前面加上 4 个字节。我使用 Netty 作为我的套接字库。我使用了 netty 的内置 protocolbuffer 编码器和解码器,但仍然没有得到正确的结果。这是我正在运行的代码:管道代码

public class SmpPipelineFactory implements ChannelPipelineFactory {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 
     */
    public SmpPipelineFactory() {
    }

    @Override
    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline p = pipeline();

        // Add Decoders
        p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());      
        //p.addLast("frameDecoder",  new LengthFieldBasedFrameDecoder(1048576, 0, 4, 0, 4));        
        p.addLast("protobufDecoder", new ProtobufDecoder(Pdu.getDefaultInstance()));

        // Add encoders
        p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
        //p.addLast("frameEncoder", new LengthFieldPrepender(4));
        p.addLast("protobufEncoder", new ProtobufEncoder());

        p.addLast("handler", new SmpChannelConnector());

        return p;
    }

}

任何帮助都会有所帮助 谢谢。

4

2 回答 2

0

您需要更多地解释什么不适合您。如果我查看 protobuf RPC java 库 ( https://code.google.com/p/protobuf-rpc-pro/ ) 中的代码,则该类是 DuplexTcpClientPipelineFactory 或 DuplexTcpServerPipelineFactory,这与您的代码基本相同,并且它“作品”。也许 protobuf-rpc-pro 库已经可以满足您的需求。

public ChannelPipeline getPipeline() throws Exception {
    ChannelPipeline p = pipeline();

    RpcSSLContext ssl = bootstrap.getSslContext();
    if ( ssl != null ) {
            p.addLast(Handler.SSL, new SslHandler(ssl.createClientEngine()) );
    }

    p.addLast(Handler.FRAME_DECODER, new ProtobufVarint32FrameDecoder());
    p.addLast(Handler.PROTOBUF_DECODER, new ProtobufDecoder(DuplexProtocol.WirePayload.getDefaultInstance(),bootstrap.getExtensionRegistry()));

    p.addLast(Handler.FRAME_ENCODER, new ProtobufVarint32LengthFieldPrepender());
    p.addLast(Handler.PROTOBUF_ENCODER, new ProtobufEncoder());

    // the connectResponseHandler is swapped after the client connection
    // handshake with the RpcClient for the Channel
    p.addLast(Handler.CLIENT_CONNECT, new ClientConnectResponseHandler());

    return p;
}

你的服务器是 netty 服务器,还是只是一个 netty 客户端?

于 2013-03-09T16:27:43.327 回答
0

我已经解决了这个问题。我所做的是根据要交换的 protobuf 数据编写自己的编码器和解码器。这里的主要问题是通道上字节的字节序。

于 2013-03-15T22:47:28.720 回答