当我运行以下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需要一个长度为1的字符串参数。”
struct包似乎是处理套接字数据的标准方法。但是,这种情况似乎很奇怪。我通过打印和看到“?”来直观地接收数据。并且代码在条件中也有“和数据”,但我无法解压缩。
是否有不同的方法来处理套接字上的二进制数据?
答案 0 :(得分:5)
elif (tick == 2) and data:
print 'from client: %r' % data # (note 1)
print struct.unpack("!B", data[0]) # (note 2)
struct.unpack
一个字节。答案 1 :(得分:2)
您可以通过调用repr()
或使用%r
格式说明符来查看对象的原始表示。
答案 2 :(得分:0)
听起来您正在尝试解释接收到的数据而不确定接收的数据代表什么。您可以通过套接字发送ascii或utf-8编码的unicode或二进制数据(整数或jpg或电影)。您的接收功能需要根据发送的内容进行调整。
如果你知道它是二进制文件,你只是发送字节吗?因为这是解压缩(“!B”,数据[0])(由TZ建议......)将给你。如果是这样,我相信答案是正确的。
您应该能够使用len(数据)来计算收到的数量,并且应该确保检查是否有部分读取(尝试发送1025字节并且仅接收1024)。