Вы можете подумать, что Python 3 усложняет задачу, но подразумевается обратное. У вас возникла проблема с применением кодировки. В python 2 было несколько причин путать с кодировками UTF-8 и Unicode. Теперь это исправлено.
Прежде всего, если вам нужно отправить двоичные данные, лучше выбрать тип ad-ho c, который равен bytes
. Используя Python 3, достаточно префикс вашей строки с b
. Это должно решить вашу проблему:
buffer = b"ABCD"
buffer += b"\xCA\xFE\xCA\xFE"
s.sendall(buffer)
Конечно, у объекта bytes
нет метода encode
, поскольку он уже закодирован в двоичный файл. Но у него есть обратный метод decode
.
Когда вы создаете объект str
, используя кавычки без префикса, по умолчанию Python 3 будет использовать кодировку Unicode (которая была применена принудительно) типом unicode
или префиксом u
в Python 2). Это означает, что вам потребуется использовать метод encode
для получения двоичных данных.
Вместо этого непосредственно используйте bytes
для хранения двоичных данных, поскольку не будет выполняться операция кодирования, и она останется такой, как вы ее набрали.
Ошибка can only concatenate str (not "bytes") to str
говорит сама за себя. Python жалуется, что не может объединить str
с bytes
, поскольку прежние данные требуют дополнительного шага, а именно кодирования, чтобы сделать операцию +
значимой.