Я предполагаю, что вы сделали с частичным кодом 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;
}
});