Ошибка типа: декодирование str не поддерживается (преобразование байтов в str) - PullRequest
0 голосов
/ 03 мая 2018

У меня есть этот код

def run(self):
    while True:
        c, a = self.sock.accept()
        print(c)
        name = c.recv(1024)
        people = ""
        self.name_list.append(str(name, 'utf-8'))
        num_g = len(self.name_list)
        c.send(bytes(str(num_g), 'utf-8'))
        print((str(num_g)))

        data = str(c.recv(1024), 'utf-8')
        print(data)
        if str(data) == "ok":
            for name in self.name_list:
                print(name)
                c.send(bytes(name, 'utf-8'))
        print(len(self.name_list))
        print(strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")

и я получаю эту ошибку

    File "./server.py", line 51, in run
    print(strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")
TypeError: decoding str is not supported

Я не понимаю, почему я получаю эту ошибку. когда я получаю байты от соединения,

name = c.recv(1024)

имя указывается в байтах, поэтому я попытался сделать его строковым при печати этой строки

1 Ответ

0 голосов
/ 03 мая 2018

Вы уже преобразовали это имя в str.

Линия

self.name_list.append(str(name, 'utf-8'))

преобразует имя в строку и сохраняет его в списке.

Тогда

for name in self.name_list:

проходит по этим именам, и в конце цикла for значение name является окончательным преобразованным именем в self.name_list.

Итак, когда вы делаете

strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")

Используется это имя, а не необработанное, возвращаемое name = c.recv(1024)

Простым решением является использование другого имени переменной в цикле for, который обрабатывает self.name_list.

...