В методе dataReceived вы возвращаете данные в виде строки неопределенной длины, что означает, что это может быть целое сообщение в вашем протоколе или оно может быть только частью сообщения, отправленного вам каким-либо «клиентом». Вам нужно будет проверить данные, чтобы убедиться, что они содержат в сообщении целое сообщение.
В настоящее время я использую Twisted в одном из своих проектов для реализации протокола и решил использовать модуль struct для упаковки / распаковки моих данных. Протокол, который я реализую, имеет фиксированный размер заголовка, поэтому я не создаю никаких сообщений, пока не прочту хотя бы количество байтов HEADER_SIZE. Общий размер сообщения объявляется в этой части данных заголовка.
Полагаю, вам не нужно определять длину сообщения как часть вашего протокола, но это помогает. Если вы не определили его, вы должны иметь специальный разделитель, который определяет, когда сообщение начинается / заканчивается. В некотором роде протокол FIX использует байт SOH для разделения полей. Хотя в нем есть обязательное поле, в котором указывается длина сообщения (но не количество полей в сообщении).