2011-07-03 45 views
2

当我运行下面的Python代码示例,从套接字读取二进制数据在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()实际上返回一些数据。我相当肯定客户没有发送'?'字符。

所以我修改代码,希望能打印'数据”的第一个字节,

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

但后来我得到一个回溯指出:‘struct.error:解压需要长度为1的字符串参数’

struct包似乎是处理套接字数据的标准方式。但是,这种情况似乎很奇怪。我通过打印和看到“?”来直观地接收数据并且代码在条件中也有一个“和数据”,但我无法解压缩。

是否有不同的方式来处理二进制数据从套接字?

回答

5
elif (tick == 2) and data: 
     print 'from client: %r' % data # (note 1) 
     print struct.unpack("!B", data[0]) # (note 2) 
  1. 打印像伊格纳西奥表示建议。
  2. 你想解压一个字节,所以给struct.unpack一个字节。
2

您可以通过调用repr()或使用%r格式说明符查看对象的原始表示。

+0

来自repr(数据)的值是'\ xaa \ xae'。我不应该能够从这个解压第一个字节吗? – brooksbp

+0

是的,但它是2个字节。 –

0

这听起来像你试图解释接收到的数据,而不确定接收到的数据代表什么。您可以通过套接字发送ascii或utf-8编码的unicode或二进制数据(整数或jpg或电影)。您的接收功能需要根据发送的内容量身定制。

如果你知道它是二进制的,你只是发送字节?因为这是全部解包(“!B”,数据[0])(如TZ所建议的)会给你。如果是这样,我相信答案是正确的。

您应该能够使用len(data)来计算出接收的数量,并且应该确保您检查是否有部分读取(尝试发送1025个字节并且只接收1024个字节)。