TypeError: необходим байтовый объект, а не 'str'
Ниже приведен код, который пытается изменить ввод, предоставленный пользователем с помощью сокетов:
from socket import *
serverName = '127.0.0.1'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = input('Input lowercase sentence:')
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print (modifiedMessage)
clientSocket.close()
Когда я выполняю его и вводю данные, возникает следующая ошибка:
Input lowercase sentence:fdsgfdf
Traceback (most recent call last):
File "C:\srinath files\NETWORKS\UDPclient.py", line 6, in <module>
clientSocket.sendto(message,(serverName, serverPort))
TypeError: a bytes-like object is required, not 'str'
Что я могу сделать, чтобы решить эту проблему?
Ответы
Ответ 1
Этот код, вероятно, подходит для Python 2. Но в Python 3 это вызовет проблему, связанную с битовой кодировкой. Я пытался создать простой TCP-сервер и столкнулся с той же проблемой. Кодировка работала для меня. Попробуйте это с помощью команды sendto
.
clientSocket.sendto(message.encode(),(serverName, serverPort))
Аналогично, вы должны использовать .decode()
для получения данных на стороне сервера UDP, если вы хотите распечатать его точно так, как он был отправлен.
Ответ 2
Кодирование и декодирование могут решить эту проблему в Python 3:
Сторона клиента:
>>> host='127.0.0.1'
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.connect((host,port))
>>> st='connection done'
>>> byt=st.encode()
>>> s.send(byt)
15
>>>
Сторона сервера:
>>> host=''
>>> port=1337
>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> s.bind((host,port))
>>> s.listen(1)
>>> conn ,addr=s.accept()
>>> data=conn.recv(2000)
>>> data.decode()
'connection done'
>>>
Ответ 3
Немного кодирования может решить следующее:
Сторона клиента:
message = input("->")
clientSocket.sendto(message.encode('utf-8'), (address, port))
Сторона сервера:
data = s.recv(1024)
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode('utf-8'))
Ответ 4
Просто замените параметр сообщения, переданный в clientSocket.sendto(message,(serverName, serverPort))
на clientSocket.sendto(message.encode(),(serverName, serverPort))
. Затем вы успешно запустите in python3
Ответ 5
Всякий раз, когда вы сталкиваетесь с ошибкой с этим сообщением, используйте my_string.encode()
.
(где my_string
- строка, которую вы передаете функции/методу).
Метод encode
объектов str
возвращает закодированную версию строки как bytes
object, которую вы можете затем использовать.
В этом конкретном случае методы сокетов такие как .send
, ожидают, что в качестве отправляемых данных объект байтов, а не строковый объект.
Поскольку у вас есть объект типа str
, и вы передаете его функции/методу, который ожидает объект типа bytes
, возникает ошибка, которая четко объясняет, что:
TypeError: a bytes-like object is required, not 'str'
Поэтому необходим метод строк encode
, применяемый к значению str
и возвращающий значение bytes
:
>>> s = "Hello world"
>>> print(type(s))
<class 'str'>
>>> byte_s = s.encode()
>>> print(type(byte_s))
<class 'bytes'>
>>> print(byte_s)
b"Hello world"
Здесь префикс b
в b'Hello world'
означает, что это действительно байтовый объект. Затем вы можете передать его любой функции, ожидающей ее, чтобы она работала плавно.