首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Google Protocol Buffer库中的IOExceptions

处理Google Protocol Buffer库中的IOExceptions
EN

Stack Overflow用户
提问于 2012-09-29 05:21:45
回答 1查看 343关注 0票数 0

我有一些尝试从Java套接字读取Google Protocol Buffer消息的代码。但是,如果mergeDelimitedFrom()方法读取无效数据,或者如果套接字连接被重置(可能还有其他原因),它可能会抛出IOException。如果连接被重置,我希望退出循环,但如果这只是一条无效消息,我希望继续运行。一种想法是只有某种类型的异常计数器,并在X个连续失败后退出,但我希望能够找出发生什么类型的错误,而不是蒙在鼓里。

这基本上就是我的代码:

代码语言:javascript
复制
while (m_Running)
{
    SomeMessage message = null;
    try
    {
        final Builder builder = SomeMessage.newBuilder();
        if (builder.mergeDelimitedFrom(m_InputStream))
        {
            message = builder.build();
        }
        else
        {
            // Google protocol buffers doesn't document it very well
            // but if mergeDelimietedFrom returns false then it has
            // reached the end of the input stream.  For a socket, no
            // more data will be coming so exit from the thread
            m_Running = false;
        }
    }
    catch (final IOException e)
    {
        // what should really be done here ???
    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-09-29 09:37:55

不要这样做。如果您直接从套接字读取协议缓冲区对象,那么您实际上就是在定义自己的应用程序协议。这比你想象的要难-- On the Design of Application Protocols中的一些问题有一个很好的概括描述。理解分帧很重要-确定一条消息的结束位置和另一条消息的开始位置。

这让我们从https://developers.google.com/protocol-buffers/docs/techniques的protobuf发明者那里得到了一些建议。关键的建议是:

如果您想要将多个消息写入单个文件或流,则由您来跟踪一条消息的结束位置和下一条消息的开始位置。

我建议您决定使用成帧协议将流划分为消息,然后编写一些自定义套接字代码来处理工作或读取套接字的字节,将它们划分为字节数组,其中每个字节数组都只包含一条消息,最后使用protobuf将每个消息字节数组反序列化为一个对象。保证不会对IOException协议进行反序列化。

您仍然需要处理IOExceptions,但它将处于较低的级别,您只需要读取字节数组,并且您将确切地知道发生错误时有多少数据已经被反序列化。

还可以考虑使用netty之类的工具来帮助编写套接字代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12647543

复制
相关文章

相似问题

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