首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有关核心网络和Protobuf的教程

有关核心网络和Protobuf的教程
EN

Stack Overflow用户
提问于 2013-10-07 07:31:07
回答 1查看 1.6K关注 0票数 2

我的工作是分布式系统(Java/EE,netty,protobuf).Wondering如何将文档从客户端发送到服务器,并将其存储在服务器数据库中。

发送字符串似乎很简单,但是如何发送一个大文件呢?我是不是需要塞进小消息然后发送过来。

任何好的教程,关于如何处理文档。

EN

回答 1

Stack Overflow用户

发布于 2013-10-07 21:12:11

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

首先,序列化大块数据(任何可能与堆相关的东西)不适合使用protobuf。要做的事情很简单;

1-获取内容的字节流(缓冲的) 2-构造一个协议消息(例如: ContentChunk),并添加至少2个字段来表示块顺序和块部分(取决于你的并发流量,你的块部分不应该破坏堆,以便明智地优化大小)本身。数据块排序将帮助服务器端以正确的顺序重建数据块。3-您可以添加一个额外的字段,用于组块的内部成帧,或者在第一条消息中传递总长度。4-最后实现主协议消息的外部帧。获取数据块并形成最终内容并持久化它。

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

ProtobufVarint32FrameDecoder ProtobufVarint32LengthFieldPrepender

你的管道应该是这样的;

代码语言:javascript
复制
        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;
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19215172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档