2013-10-06 62 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; 
     } 
    });