我正在开发一个使用协议缓冲区作为序列化程序的应用程序。我的应用程序将是服务器的客户端。要求是在发送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;
}
}
任何帮助都会有所帮助 谢谢。
答案 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数据编写自己的编码器和解码器。这里的主要问题是通道上字节的字节顺序。