Во-первых, Википедия не является авторитетным ресурсом, поэтому не делайте ставки на нее.
Нет, Thrift не является бинарным протоколом связи. Thrift не является протоколом.
Thrift is a framework, что дает возможность сериализации в и общаться более различных протоколов и транспортирует, которые включают в себя HTTP и бинарный файл, но ни в коем случае не ограничивается этим.
На самом деле, вся идея о библиотеке Thrift заключается в том, чтобы предложить богатый набор возможностей, из которых конкретное решение можно построить как можно более свободно. Вы хотите JSON через HTTP? Конечно, держи. Вы хотите иметь двоичный код, но вам нужно что-то более компактное, чем двоичное? Конечно, используйте TCompactProtocol
или GZIP. Вы хотите добавить TLS? Нет проблем, просто добавьте его в свой стек. Именованные трубы? SASL? Сообщения? Вы называете это.
И если этого недостаточно (или если конкретный элемент еще не был реализован для выбранного вами языка), то всегда можно написать собственную реализацию транспорта или протокола. Это не сложно, и the /contrib
folder уже содержит несколько примеров.
Я понимаю, что, возможно, я неправильно понимаю, что означает «протокол» в контексте «Трэйфта».
Действительно, протокол является перегруженным термином. В контексте Thrift протокол представляет собой некоторую реализацию, которая происходит от TProtocol
.
void WriteMessageBegin(TMessage message);
void WriteMessageEnd();
void WriteStructBegin(TStruct struc);
void WriteStructEnd();
void WriteFieldBegin(TField field);
void WriteFieldEnd();
void WriteFieldStop();
void WriteMapBegin(TMap map);
void WriteMapEnd();
void WriteListBegin(TList list);
void WriteListEnd();
void WriteSetBegin(TSet set);
void WriteSetEnd();
void WriteBool(bool b);
void WriteByte(sbyte b);
void WriteI16(short i16);
void WriteI32(int i32);
void WriteI64(long i64);
void WriteDouble(double d);
void WriteString(string s);
void WriteBinary(byte[] b);
TMessage ReadMessageBegin();
void ReadMessageEnd();
TStruct ReadStructBegin();
void ReadStructEnd();
TField ReadFieldBegin();
void ReadFieldEnd();
TMap ReadMapBegin();
void ReadMapEnd();
TList ReadListBegin();
void ReadListEnd();
TSet ReadSetBegin();
void ReadSetEnd();
bool ReadBool();
sbyte ReadByte();
short ReadI16();
int ReadI32();
long ReadI64();
double ReadDouble();
string ReadString();
byte[] ReadBinary();
Протоколы транзита предлагают высокоуровневый способ записи и считывания с базового транспортного уровня. Протокол Thrift отвечает за перевод между данными, используемыми в программе, и необработанными байтами, которые входят в родной транспорт. Например, TJSONProtocol
заботится о рендеринге и анализе данных в байтах JSON и из них.
Напротив, производное Thrift TTransport
, находящееся ниже уровня протокола, определяет, где данные хранятся физически. Этот аспект полностью абстрагирован, уровень протокола не имеет понятия о физическом носителе (и не должен). И наоборот, транспортный уровень не знает, что означают данные, проходящие через него, он видит только байты.
Если http был ограничен текстом, как вы могли скачать программу, изображение или почтовый файл с веб-сайта через http? Как вы могли видеть логотип SO наверху этой страницы?Или общий аватар рядом с вашим именем пользователя? –
Привет, я знаю, что полезная нагрузка http может быть двоичной, но то, что я подразумевал под «текстовым протоколом», заключается в том, что метаданные в запросе и ответе кодируются как текстовые символы, а не в двоичном формате. Разница обсуждается здесь http://stackoverflow.com/questions/2645009/binary-protocols-v-text-protocols. По этой причине Http считается текстовым протоколом. – StackMonster
Я обращался к вашему второму абзацу, где вы говорите * через http, который, как я полагал, был текстовым протоколом, а не двоичным *. –