Комиссионный клиент C ++: как отправить буфер без длины?

У меня есть клиентское приложение на 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 байта), а затем данные — целое число.

Это означает, что клиент отправляет
длина (int)
данные (int)

но сервер читает только данные.

Как я могу отправлять только данные? Я могу использовать другой транспортный протокол или протокол или использовать нетривиальную библиотеку …

1

Решение

Более общее утверждение заключается в том, что клиентский протокол / транспортный стек Thrift должен соответствовать стороне сервера, в противном случае вы, скорее всего, попадете в беду.

Например. если сервер использует двоичный протокол, кадрированный и мультиплексный транспорт, клиент должен сделать то же самое.

3

Другие решения

Но если вы используете неблокирующий сервер, то вы должны использовать TFramededTransport

1

Использовать TBufferedTransport вместо TFramededTransport, потому что TFramedTransport добавляет (!) Длину перед буфером.

0
По вопросам рекламы [email protected]