2013-10-06 60 views
2

我正在使用分布式系统(Java/EE,netty,protobuf)。了解如何将文档从客户端发送到服务器并将其存储在服务器数据库中。关于核心netty和Protobuf的教程

发送字符串似乎很简单,但我怎么去发送一个大文件。我是否需要分成小消息并发送。

任何好的教程,关于如何使用文档。

回答

1

我假设你已经完成了netty的样板代码部分,你有一个正在运行的协议缓冲区拦截器设置服务器,并且你已经生成了协议缓冲区相关的类。如果您需要这些步骤的帮助,请说出来,我会编辑并添加它们。

首先,序列化大块数据(任何可能随堆调节的东西)对于protobuf来说并不好。简单的事情要做;

1-获取内容的字节流(缓冲) 2-构建protobuf消息(例如:ContentChunk)并添加表示块顺序和块部分的最小2个字段(根据并发流量,您的块部分不应该堆积如此,所以明智地优化大小)本身。块顺序将帮助服务器端以正确的顺序重新构建块。 3-您可以为组块的内部框架添加一个附加字段,或在第一条消息中传递总长度。 4,最后实现主协议消息的外部组帧。获取大块并形成最终内容并坚持下去。

对于第四项,请检查Netty当前的成帧支持。

ProtobufVarint32FrameDecoder ProtobufVarint32LengthFieldPrepender

你的管道应该是这样的;

 bootstrap.setPipelineFactory (new ChannelPipelineFactory() { 
     @Override 
     public ChannelPipeline getPipeline() throws Exception { 
      ChannelPipeline pipeline = Channels.pipeline(); 
      pipeline.addLast ("frameDecoder", new ProtobufVarint32FrameDecoder()); 
      pipeline.addLast ("protobufDecoder", new ProtobufDecoder (YOURPROTOCOL.ProtocolMessage.getDefaultInstance())); 

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

      pipeline.addLast ("handler", new ClientEventHandler()); 
      return pipeline; 
     } 
    });