【问题标题】:C++ thrift client: how to send buffer without length?C++ thrift 客户端:如何发送没有长度的缓冲区?
【发布时间】:2013-09-02 01:23:58
【问题描述】:

我有我的 C++ 客户端应用程序和 Java 服务器。 客户端应用程序连接并向服务器发送数据。

例如我发送整数值:

boost::shared_ptr<TSocket> socket(new TSocket(hostMS, portMS));
    boost::shared_ptr<TFramedTransport> transport(new TFramedTransport(socket));
    boost::shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport));

transport->open();
protocol->writeI32(0xCA12EEAA);
transport->writeEnd();
transport->flush();

服务器端代码为:

int nMagic =0;
// int nLen = in.readInt(); <------------here is I read the length
int ch1 = in.read();
                int ch2 = in.read();
                int ch3 = in.read();
                int ch4 = in.read();
                if ((ch1 | ch2 | ch3 | ch4) < 0)
                    throw new EOFException();
             nMagic = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

问题是: 当我再添加一个读取整数(请参阅我的评论)时,它可以正常工作。首先我读取长度(4 个字节),然后读取数据 - 整数。

表示客户端发送 长度(整数) 数据(整数)

但服务器只读取数据。

我怎样才能只发送数据?我可以使用其他 thrift 传输或协议或使用非 Thrift 库...

【问题讨论】:

  • 没有长度属性,对方怎么知道要读取多少数据?
  • 嗯.. 但事实如此。服务器不读取它。可能是以前在基本 Java 类中读过的。我做了另一个实验:运行套接字测试实用程序 Hercules (www.hw-group.com) 并连接到服务器,然后发送十六进制值 - 服务器成功接收。

标签: c++ thrift thrift-protocol


【解决方案1】:

更一般的说法是,客户端 Thrift 协议/传输堆栈必须与服务器端匹配,否则你很可能会遇到麻烦。

例如如果服务器使用二进制协议、成帧和多路传输,客户端必须做同样的事情。

【讨论】:

    【解决方案2】:

    但是如果你使用非阻塞服务器,那么你必须使用 TFramededTransport

    【讨论】:

      【解决方案3】:

      使用 TBufferedTransport 代替 TFramededTransport 因为 TFramedTransport 在缓冲区之前添加 (!) 长度。

      【讨论】:

      • 看起来很有趣。我想这适用于所有节俭平台(python、node)。你是怎么想到这个问题的——或者你为什么需要答案?
      猜你喜欢
      • 1970-01-01
      • 2010-11-09
      • 2015-08-24
      • 2013-10-27
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      相关资源
      最近更新 更多