繁体   English   中英

TypeError:需要一个类似字节的对象,而不是“str”

[英]TypeError: a bytes-like object is required, not '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'

我能做些什么来解决这个问题?

此代码适用于 Python 2。但在 Python 3 中,会导致位编码错误。 我试图制作一个简单的 TCP 服务器并遇到了同样的问题。 编码解决了这个问题。 sendto命令试试这个。

clientSocket.sendto(message.encode(),(serverName, serverPort))

同样,您应该使用.decode()在 UDP 服务器端接收数据,如果您想完全按照发送的方式打印它。

编码和解码可以在 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'
>>>

一点编码可以解决这个问题:

客户端:

message = input("->")
clientSocket.sendto(message.encode('utf-8'), (address, port))

服务器端:

data = s.recv(1024)
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode('utf-8'))

只需将clientSocket.sendto(message,(serverName, serverPort))中传递的消息参数替换为clientSocket.sendto(message.encode(),(serverName, serverPort)) 然后你就可以在python3中成功运行了

每当您遇到此消息的错误时,请使用my_string.encode()

(其中my_string是您传递给函数/方法的字符串)。

str对象的encode方法将字符串的编码版本作为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'Hello world'中的前缀b表示这确实是一个字节对象。 然后,您可以将它传递给任何期望它的函数,以使其顺利运行。

在发送数据中添加“b”,如下所示: request = client.send(b"GET / HTTP/1.1\r\nHost: google.com\r\n\r\n")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM