我的工作是分布式系统(Java/EE,netty,protobuf).Wondering如何将文档从客户端发送到服务器,并将其存储在服务器数据库中。
发送字符串似乎很简单,但是如何发送一个大文件呢?我是不是需要塞进小消息然后发送过来。
任何好的教程,关于如何处理文档。
发布于 2013-10-07 21:12:11
我假设你已经完成了netty的样板代码部分,你有一个正在运行的服务器,设置了protocol buffer拦截器,并且你已经生成了你的protocol buffer相关类。如果你需要这些步骤的帮助,请说出来,我会编辑并添加它们。
首先,序列化大块数据(任何可能与堆相关的东西)不适合使用protobuf。要做的事情很简单;
1-获取内容的字节流(缓冲的) 2-构造一个协议消息(例如: 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;
}
});https://stackoverflow.com/questions/19215172
复制相似问题