typeError:需要bytelike对象,而不是Python3中的'str'

2024-04-19 23:08:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python新手,我正在尝试一些东西。我正在尝试使用python套接字在python3中解决这个UDP客户端和服务器程序

名为UDpserver.py的UDP服务器程序的目标如下:

  • 从客户端接收消息
  • 使用相同的消息响应客户机,但全部使用大写字母

名为UDpclient.py的客户端程序连接到上述服务器并从服务器接收响应的目标:

  • 向服务器发送消息
  • 显示从服务器收到的消息。显示的信息应为大写

以下是服务器程序的代码(UDpserver.py):

from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print (“The server is ready to receive”)
while 1:
 message, clientAddress = serverSocket.recvfrom(2048)
 modifiedMessage = message.upper()
 serverSocket.sendto(modifiedMessage, clientAddress)

以下是客户端程序代码(UDpclient.py)

import socket
serverName = ‘hostname’
serverPort = 12000
clientSocket = socket.socket(socket.AF_INET,
 socket.SOCK_DGRAM)
message = input(’Input lowercase sentence:’)
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print modifiedMessage
clientSocket.close() 

当我运行客户机程序(Udpclient.py)时,在它允许我输入小写字母后,我得到了这个错误:

TypeError:第7行需要类似字节的对象,而不是'str',即 发送到(消息,(服务器名,服务器端口))

TypeError: a bytes-like object is required, not 'str'

如果有人能帮我解决这个问题。多谢各位


Tags: py服务器消息客户端message目标客户机socket
3条回答

在将“主机名”更改为实际IP并使用更新错误代码后解决了此问题

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

Python 3字符串完全支持unicode规范。内存中的字符串在通过网络发送之前,必须以某种方式序列化,以符合某种编码,如ASCII、UTF-8、各种Windows代码页等sendto需要已编码的字节字符串

因为您在机器之间传输数据,所以让每台机器选择自己的编码不是一个好主意。对于自主开发的协议,最简单的选择就是声明将使用UTF-8,这是最具互操作性的unicode编码

clientSocket.sendto(message.encode("utf-8"),(serverName, serverPort))

接收器将使用相同的编码进行解码

您可以使用message.encode()对字符串类型的消息进行编码。这就是你的UDPclient.py的样子:

import socket
serverName = ‘hostname’
serverPort = 12000
clientSocket = socket.socket(socket.AF_INET,
 socket.SOCK_DGRAM)
message = input(’Input lowercase sentence:’)
clientSocket.sendto(message.encode(),(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print modifiedMessage
clientSocket.close() 

相关问题 更多 >