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