我正在挖掘python和网络。
while True:
data = sock.recv(10240)
这绝对是在倾听。但它似乎需要转换为文本字符串。
我见过一些人使用 struct.unpack(),但我不确定它是如何工作的。 转换的方式是什么?
答案 0 :(得分:18)
您从recv
获得的内容是bytes
字符串:
从套接字接收数据。返回值是表示接收数据的字节对象。
在Python 3.x中,要将bytes
字符串转换为Unicode文本str
字符串,您必须知道字符串编码的字符集,因此您可以调用{{3} }。例如,如果它是UTF-8:
stringdata = data.decode('utf-8')
(在Python 2.x中,bytes
与str
是一样的,所以你已经得到一个字符串。但是如果你想得到一个Unicode text unicode
string,与3.x中的相同。)
人们经常使用decode
的原因是数据不仅仅是8位或Unicode文本,还有其他一些格式。例如,您可以将每条消息作为“struct
”发送:长度(作为ASCII数字字符串),后跟:
分隔符,然后是length
字节的UTF-8,然后是,
- 例如b"3:Abc,"
。 (格式上有变体,但这是Bernstein标准的netstring。)
人们使用网络字符串或其他类似技术的原因是,当您使用TCP时,需要某种方式来分隔消息。每个recv
可以为您提供另一方通过send
的一半,或者它可以提供您的3 send
和第4个的一部分。因此,您必须累积recv
数据的缓冲区,然后从中拉出消息。你需要一些方法来判断一条消息何时结束,另一条消息何时开始。如果您只是发送没有任何换行符的纯文本消息,则可以使用换行符作为分隔符。否则,您将不得不想出其他东西 - 可能是netstrings,或者使用\0
作为分隔符,或者使用换行符作为分隔符但是在数据中转义实际换行符,或者使用某些自定义的结构化格式,如JSON。
答案 1 :(得分:3)
在Python 2.7.x及之前,data
已经是一个字符串。在Python 3.x中,data
是一个字节对象。要将字节转换为字符串,请使用decode()
方法。 decode()
将需要一个编解码器参数,例如'utf-8'。