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

sri*_*sri 47 python sockets python-3.x

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

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()
Run Code Online (Sandbox Code Playgroud)

当我执行它并提供输入时,会发生以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

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

小智 64

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

clientSocket.sendto(message.encode(),(serverName, serverPort))
Run Code Online (Sandbox Code Playgroud)

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


小智 17

编码和解码可以在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
>>>
Run Code Online (Sandbox Code Playgroud)

服务器端:

>>> 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'
>>>
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅 http://nedbatchelder.com/text/unipain.html 以了解为什么 Python 3 中发生了这种变化。 (2认同)

Wll*_*iam 11

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

客户端:

message = input("->")
clientSocket.sendto(message.encode('utf-8'), (address, port))
Run Code Online (Sandbox Code Playgroud)

服务器端:

data = s.recv(1024)
modifiedMessage, serverAddress = clientSocket.recvfrom(message.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)


小智 5

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