在Python中从套接字读取二进制数据

2 投票
3 回答
10177 浏览
提问于 2025-04-16 20:43

当我运行以下的Python示例代码时,

tick = 0
while True:
    tick += 1
    print tick
    data = s.recv(1024)
    if (tick == 1) and data:
        print 'from client: %s' %(data)
    elif (tick == 2) and data:
        print 'from client: %s' %(data)

我看到,

1
from client: client msg
2
from client: ?
3

我的直觉告诉我,第二次调用s.recv()实际上是返回了一些数据。而且我很确定客户端并没有发送`?`这个字符。

于是我修改了代码,希望能打印出`data`的第一个字节,

    elif (tick == 2) and data:
        print 'from client: %s' %(data)
        print struct.unpack("!B", data)

但是我得到了一个错误提示:“struct.error: unpack requires a string argument of length 1。”

struct这个包似乎是处理socket数据的标准方式。不过,这种情况看起来有点奇怪。我通过打印看到数据,看到有一个“?”,而且代码的条件里也有“and data”,但我却无法解包。

有没有其他方法可以处理从socket获取的二进制数据呢?

3 个回答

0

听起来你是在尝试理解收到的数据,但不太确定这些数据代表什么。你可以通过网络连接发送多种类型的数据,比如ascii编码、utf-8编码的unicode,或者是二进制数据(比如整数、jpg图片或者视频)。你接收数据的函数需要根据发送的数据类型进行调整。

如果你知道数据是二进制的,那你只是发送字节吗?因为这样的话,unpack("!B",data[0])(正如TZ所建议的)只会给你一个字节的值。如果是这样,我觉得这个回答是对的。

你应该可以用len(data)来判断收到的数据量,并且要确保检查是否有部分数据被读取(比如你尝试发送1025字节,但只收到1024字节)。

2

你可以通过调用 repr() 函数或者使用 %r 这个格式化符号来查看一个对象的原始表现形式。

5
elif (tick == 2) and data:
        print 'from client: %r' % data # (note 1)
        print struct.unpack("!B", data[0]) # (note 2)

1. 按照Ignacio的建议,打印出表示形式。

2. 你想要解包一个字节,所以给struct.unpack一个字节的内容。

撰写回答