У меня есть клиентское приложение на 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)
но сервер читает только данные.
Как я могу отправлять только данные? Я могу использовать другой транспортный протокол или протокол или использовать нетривиальную библиотеку …
Более общее утверждение заключается в том, что клиентский протокол / транспортный стек Thrift должен соответствовать стороне сервера, в противном случае вы, скорее всего, попадете в беду.
Например. если сервер использует двоичный протокол, кадрированный и мультиплексный транспорт, клиент должен сделать то же самое.
Но если вы используете неблокирующий сервер, то вы должны использовать TFramededTransport
Использовать TBufferedTransport вместо TFramededTransport, потому что TFramedTransport добавляет (!) Длину перед буфером.