TypeError:需要类似字节的对象,而不是'str'

时间:2015-10-07 22:29:23

标签: python python-3.x sockets

以下是尝试使用套接字修改用户提供的输入的代码:

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'

我该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:60)

这段代码可能对Python 2有用。但在Python 3中,这会引起一个问题,与位编码有关。我试图制作一个简单的TCP服务器并遇到同样的问题。编码对我有用。使用sendto命令尝试此操作。

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

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

答案 1 :(得分:14)

编码和解码可以在python 3中解决这个问题:

客户端:

alert('foo')

服务器端:

>>> 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
>>>

答案 2 :(得分:10)

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

客户端:

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

服务器端:

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

答案 3 :(得分:4)

只需将clientSocket.sendto(message,(serverName, serverPort))中传递的邮件参数替换为clientSocket.sendto(message.encode(),(serverName, serverPort))即可。然后你就可以在 python3

中成功运行

答案 4 :(得分:1)

每当您遇到此消息时出现错误使用my_string.encode()

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

encode对象的str方法将字符串的编码版本返回为bytes object,然后您可以使用它。 在此特定实例中,套接字方法such as .send 期望字节对象作为要发送的数据,不是字符串对象

由于您有一个str类型的对象,并且您将其传递给期望类型为bytes的对象的函数/方法,因此会出现一个错误,该错误清楚地解释了:< / p>

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'表示这确实是一个字节对象。然后,您可以将其传递给任何期望的功能,以使其顺利运行。