简单';聊天';UDP客户端和服务器使用Python,可以';不要将'str'用作'send()'有效负载
我正在尝试在python中使用UDP进行简单的“聊天”。我已经完成了客户端和服务器代码 客户 服务器 在客户端,我得到了简单';聊天';UDP客户端和服务器使用Python,可以';不要将'str'用作'send()'有效负载,python,udp,Python,Udp,我正在尝试在python中使用UDP进行简单的“聊天”。我已经完成了客户端和服务器代码 客户 服务器 在客户端,我得到了 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.s
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'
python服务器.py
客户:“海伊”
服务员:“海在那里”
回溯(最近一次呼叫最后一次):
文件“server.py”,第12行,在
fd.sendto(回复,客户地址)
类型错误:需要类似字节的对象,而不是“str”
如何解决这个问题?有什么问题吗
~
如何解决这个问题?有什么问题吗
嗯:
正如错误所说,您不能直接发送字符串(Python3字符串不仅仅是一个字节容器);您必须首先将其转换为bytearray
:
fd.sendto(bytearray(reply,"utf-8"), client_address)
请注意,您需要指定编码;如果你想一想英语中不常见的字符在字节级别上的表示方式有多么不同,这就很有意义了。这种转换的好处是,使用unicode,您可以以任何语言发送几乎任何文本:
fd.sendto(bytearray("सुंदर भाषा","utf-8"), client_address)
另一方面,您也将收到一个字节,必须首先将其转换为字符串;同样,编码也会有所不同,您必须使用与发送相同的编码:
r = fd.recvfrom(1000)
received_msg = str(r, "utf-8")
您的print(“%s”%r)
使用默认编码隐式调用str
,但这在网络中很可能不是一个好主意。使用utf-8是将字符串编码为字节的非常好的方法
提供最少的背景信息:字符串的行为应该像字符串一样,也就是说,一段由字母/字形/符号组成的文本,一种文本表示,而不是一些二进制内存。因此,当将一段内存发送给其他人时,您需要确保您的文本在两端都基于一个通用表示法(在本例中为UTF8)被理解。只需使用
fd.sendto(reply.encode(),client_address)
将字符串转换为字节即可。非常欢迎您;享受聊天服务器的乐趣:)正如你所看到的,我的名字本身不能用ASCII(u
)来表示,所以这类问题对我来说非常常见,例如:received_msg=str(reply,“utf-8”)Type Error:str()最多接受1个参数(给定2个),我觉得你在使用python3<代码>str(字节数组(“सुंदर भाषा", "utf-8“,“utf-8”)非常适合我。
fd.sendto(bytearray(reply,"utf-8"), client_address)
fd.sendto(bytearray("सुंदर भाषा","utf-8"), client_address)
r = fd.recvfrom(1000)
received_msg = str(r, "utf-8")