协议缓冲区挑战

时间:2013-03-08 15:18:54

标签: java protocol-buffers

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

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;
    }

}

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

2 个答案:

答案 0 :(得分: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客户端?

答案 1 :(得分:0)

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