类型错误:需要一个类似字节的对象,而不是“str”
- 2025-02-11 09:51:00
- admin 原创
- 47
问题描述:
以下是尝试使用套接字修改用户提供的输入的代码:
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 filesNETWORKSUDPclient.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))
。然后你就可以在python3clientSocket.sendto(message.encode(),(serverName, serverPort))
中成功运行
解决方案 5:
每当您遇到此消息的错误时请使用my_string.encode()
。
(my_string
您传递给函数/方法的字符串在哪里)。
encode
对象方法将str
字符串的编码版本作为bytes
对象返回,然后您可以使用该对象。在此特定实例中,套接字方法(例如).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'
表示这确实是一个字节对象。然后你可以将它传递给任何需要它的函数,以便它顺利运行。
解决方案 6:
在发送数据中添加“b”,如下所示: request = client.send(b"GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")