2013-10-06 3 views
2

Я работаю с распределенными системами (Java/EE, netty, protobuf). Представляю, как отправить документ с клиента на сервер и сохранить его в базе данных сервера.Учебники по Core netty и Protobuf

Отправка строки кажется простой, но как я могу отправить большой файл. Нужно ли мне помещать небольшие сообщения и отправлять их.

Любые хорошие учебники, о том, как работать с документами.

ответ

1

Я предполагаю, что вы сделали с частичным кодом netplate, у вас есть работающий сервер с установленными перехватчиками протокольных буферов, и вы создали классы связанных буферов протокола. Если вам нужна помощь в выполнении этих шагов, скажите об этом, я отредактирую и добавлю их.

Прежде всего, сериализация больших кусков данных (все, что может нравиться с кучей) не подходит для протобуфа. Простая вещь (ы);

1- Получить поток байтов (буферизованный) содержимого 2- Построить сообщение protobuf (например: ContentChunk) и добавить минимум 2 поля, представляющих порядок фрагмента и часть фрагмента (в зависимости от вашего параллельного трафика части вашего фрагмента не должен взламывать кучу, чтобы оптимизировать размер с умом). Порядок порций поможет серверной стороне восстановить кусок в правильном порядке. 3- Вы можете добавить дополнительное поле для внутреннего кадрирования кусков или передать общую длину в первом сообщении. 4- Наконец, выполните внешнее кадрирование для основного сообщения протокола. Получите куски и сформируйте окончательный контент и сохраните его.

Для 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; 
     } 
    }); 
Смежные вопросы