繁体   English   中英

typeError:需要一个类似字节的对象,而不是 Python 3 中的“str”

[英]typeError: a byte-like object is required, not 'str' in Python 3

我是 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)时,它让我输入小写字母后出现此错误:

类型错误:需要一个类似字节的对象,而不是第 7 行的“str” ,即 clientSocket.sendto(message,(serverName, serverPort))

类型错误:需要类似字节的对象,而不是“str”

如果有人可以请帮我解决这个问题。 谢谢你。

您可以使用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() 

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

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

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

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

将“主机名”更改为实际 IP 并使用以下命令更新错误代码后解决了该问题

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

暂无
暂无

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

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