Python Socket Send Buffer Vs. улица - PullRequest
9 голосов
/ 09 марта 2010

Я пытаюсь получить базовый сервер (скопированный из Beginning Python) для отправки str.

Ошибка:

c.send( "XXX" )
TypeError: must be bytes or buffer, not str

Кажется, работает при травлении объекта. Похоже, что все примеры, которые я нашел, могут отправить строку без проблем.

Любая помощь будет оценена,

Стивен

import socket  
import pickle  

s = socket.socket()

host = socket.gethostname()

port = 80

s.bind((host, port))

s.listen(5)

while True:  
    c, addr = s.accept()  
    print( "Got Connection From ", addr )  
    data = pickle.dumps(c)  
    c.send( "XXX" )  
    #c.send(data)  
    c.close()

Ответы [ 2 ]

22 голосов
/ 09 марта 2010

Кажется, вы пытаетесь использовать примеры Python 2.x в Python 3, и вы обнаруживаете одно из основных отличий между этими версиями Python.

Для Python <3 «строки» фактически являются двоичными строками, а «объекты Юникода» являются правильными текстовыми объектами (так как они могут содержать любые символы Юникода). </p>

В Python 3 строки юникода - это «обычные строки» (str), а строки байтов - это отдельные объекты.

Низкоуровневый ввод / вывод может быть выполнен только с данными (строки байтов), но не с текстом (последовательность символов). Для Python 2.x str также был типом «двоичные данные». В Python 3 его больше нет, и следует использовать один из специальных объектов данных. Объекты травятся до таких байтовых строк. Если вы хотите ввести их вручную в коде, используйте префикс «b» (b «XXX» вместо «XXX»).

12 голосов
/ 09 марта 2010

Чтобы добавить в ответ Яцека Конечного: Вы также можете использовать str.encode () для получения байтов из строки. Если у вас есть строка в переменной вместо литерала, вы можете вызвать encode, и она вернет эквивалентную серию байтов.

...