简单的“chat”UDP客户端和服务器使用Python,不能将“str”用作“send()`payload”

2024-04-19 01:22:30 发布

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

我正在尝试用python中的UDP做一个简单的“聊天”。我已经完成了客户端和服务器的代码

客户

import socket
fd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
udp_ip = '127.0.0.1'
udp_port = 8014
while(True):
    message = input("Client :")
    fd.sendto(message, (udp_ip, udp_port))
    reply = fd.recvfrom(1000)
    print("Server:%s"%(reply))

服务器

^{pr2}$

在客户端我得到了

python client.py 
Client :'haii'

在服务器端我得到

 python server.py 
 client : 'haii'
 server : 'hai there'
 Traceback (most recent call last):
 File "server.py", line 12, in <module>
 fd.sendto(reply, client_address)
 Type Error: a bytes-like object is required, not 'str'  

如何解决这个问题?有什么问题吗?在

~


Tags: pyip服务器client客户端messageserverport
1条回答
网友
1楼 · 发布于 2024-04-19 01:22:30

How to solve this problem? Is anything wrong there?

好吧:

fd.sendto(reply, client_address)
Type Error: a bytes-like object is required, not 'str'

正如错误所说,您不能直接发送字符串(Python3字符串不仅仅是一个字节容器);您必须首先将其转换为bytearray

 fd.sendto(bytearray(reply,"utf-8"), client_address)

请注意,您需要指定编码;如果您想一想在字节级别上表示英语中不常见的字符有多不同,这很有意义。这种转换的好处是,使用unicode,您可以用任何语言发送几乎任何文本:

^{pr2}$

另一方面,你也会收到一个字节的东西,它必须首先转换成一个字符串;同样,编码也会产生影响,你必须使用与发送相同的编码:

r = fd.recvfrom(1000)
received_msg = str(r, "utf-8")

您的print("%s" % r )使用默认编码隐式调用str,但这在网络中很可能不是一个好主意。使用utf-8是将字符串编码为字节的非常好的方法。在

提供最少的背景信息:字符串的行为应该像字符串一样,即由字母/字形/符号组成的文本,文本的表示,而不是二进制内存。因此,当将一段内存发送给其他人时,您需要确保您的文本是基于一个公共表示(在本例中为UTF8)的两端都能被理解。在

相关问题 更多 >