Вопрос

В Twisted при реализации метода dataReceived, похоже, нет примеров, относящихся к фрагментации пакетов. На любом другом языке это то, что вы реализуете вручную, поэтому мне просто интересно, сделано ли это для вас уже в крученом виде или как? Если так, нужно ли мне ставить префикс перед заголовком? Или я должен сделать это вручную? Если да, то как это будет?

Это было полезно?

Решение

В методе dataReceived вы возвращаете данные в виде строки неопределенной длины, что означает, что это может быть целое сообщение в вашем протоколе или оно может быть только частью сообщения, отправленного вам каким-либо «клиентом». Вам нужно будет проверить данные, чтобы убедиться, что они содержат целое сообщение в вашем протоколе.

В настоящее время я использую Twisted в одном из своих проектов для реализации протокола и решил использовать модуль struct для упаковки / распаковки моих данных. Протокол, который я реализую, имеет фиксированный размер заголовка, поэтому я не создаю никаких сообщений, пока не прочту хотя бы количество байтов HEADER_SIZE. Общий размер сообщения объявляется в этой части данных заголовка.

Полагаю, вам не нужно определять длину сообщения как часть вашего протокола, но это помогает. Если вы не определили его, вы должны иметь специальный разделитель, который определяет, когда сообщение начинается / заканчивается. В некотором роде протокол FIX использует байт SOH для разделения полей. Хотя в нем есть обязательное поле, в котором указывается длина сообщения (но не количество полей в сообщении).

Другие советы

При работе с TCP вы действительно должны забыть все понятия «пакеты». TCP - это потоковый протокол - вы передаете данные, а потоки данных - с другой стороны. После того, как данные отправлены, им разрешено поступать в таком количестве или в нескольких блоках, как они хотят, при условии, что все данные поступают в правильном порядке. Вам придется вручную выполнять разделение, как и в других языках, с полем длины, полем типа сообщения, специальным символом-разделителем и т. Д.

Вы также можете использовать протокол LineReceiver

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top