Python3套接字无法解码内容

时间:2017-11-08 09:01:16

标签: python-3.x sockets decode

我面临一个奇怪的问题。当我在python 2.7中使用相同的代码时,我无法解码通过套接字连接接收的数据。我知道在python 2中收到的数据类型是一个字符串,在python 3中是一个字节。但我不明白为什么我在尝试解码时收到错误。 我发送完全相同的数据(复制/粘贴以确保),除了我需要为python 3执行.encode()以避免接收" TypeError,需要类似字节的对象,而不是' STR' "

Python2:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
s.connect((SERVERIP, SERVERPORT))
s.send(message)
data = ''
while True:
    new_data = s.recv(4096)
    if not new_data:
        break
    data += new_data
    s.close()

Python 3

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
s.connect((SERVERIP, SERVERPORT))
s.send(message)
data = ''
while True:
    new_data = s.recv(4096)
    if not new_data:
        break
    data += new_data.decode('utf-8') #same result with new_data.decode()
    s.close()

Python 2 new_data内容:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdd\x12B@\x18\x00\xd0\x07r\xa3\xb6\xfdv]t\xa1T&\xb5d\x91\xd1tA\x98]F\xfeB\x1a\x0f\xdf9yu\x10s\xa3\xa29:\xdbl\xae\xe9\xe8\xd9H\xc8v\xa8\xd0K\x8c\xde\xd7\xef\xf9\xc4uf\xca\xfd \xdd\xb7\x0c\x9a\x84\xe9\xec\xb7\xf1\xf3\x97o\\k\xd5E\xc3\r\x11(\x9d{\xf7!\xdc*\x8c\xd5\x1c\x0b\xadG\xa5\x1e(\x97dO\x9b\x8f\x14\xaa\xddf\xd7I\x1e\xbb\xd4\xe7a\xe4\xe6a\x88\x8b\xf5\xa0\x08\xab\x11\xda\xea\xb8S\xf0\x98\x94\x1c\x9d\xa24>9\xbai\xd3\x1f\xe6\xcc`^\x91\xca\x02j\x1aLy\xccj\x0fdVn\x17@\xb0\xc1@\x80hX#\xb0\x06\n\x0b\xc0\xf2x\xfe\x01?\x05\x1f\xc1\xc5\x00\x00\x00'

Python3 new_data内容:

b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\x05\xc1\xdb\x12B@\x00\x00\xd0\x0f\xf2\xc0\xda\xb5\xcbC\x0f"-\xb9gPM\x0f\x85&\x8b)\xb7\x1d\x1a\x1f\xdf9\xe3\xbc\xbe\xfd\x9e\xd9A\xe3:\x851,\xcf\xc4\xe5\x865|\xa5\xcb\xbb\xcbs\xa8\x8f\xcc\x1b\xf7\x06\xc5\x8f\xfa\xba\x84\xd8>\xea\xc0\xa5b\xe6\xceC\xea\xd0\x88\xebM\t\xd7\xf8\xc1*#hI\xd6F\x80\xb3B[\xa7\x99\x91\xbe\x16%Q\xf5\x1d(\xa0\x93\x87\n\x13\xbe\x92\x91\xcc\xbfT\x98b\xd3\x0b=\xc0\xd5\xb3\xdf}\xcc\xc9\xb1\xe4\'\xb1\xe25\xcc{tl\xe5\x92\xf34x\xd5\xa1\xf9K\xa4\xa8k\xa8 dU\xd7\x1e\xce\xb4\x02\xean\xc3\x10#\x05\x13L\x14\xa0(H\xd2d\xb8a\xbc\xdd\xee\x7f\x1b\xe5\xf1\xd2\xc5\x00\x00\x00'

因此,当我在python3中尝试解码时收到此错误:

'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

收到的数据不一样。差异在' x12B @'之后开始。有人有解释吗?

我没有管理服务器端,所以不要让我检查这一面!

谢谢,

马修

1 个答案:

答案 0 :(得分:1)

对于Python 3,您需要使用字节,您拥有的数据不是文本字符串,因此不要尝试将其解释为一个。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(15)
s.connect((SERVERIP, SERVERPORT))
s.send(message)
data = b''
while True:
    new_data = s.recv(4096)
    if not new_data:
        break
    data += new_data
    s.close()

这应该是接收数据所需的全部内容:以使用b''bytes()创建的空字节对象开始,但是当您使用时,还必须注意使用字节来处理数据,以便代码可能也需要更改。

下一步处理这可能是:

import gzip
text = gzip.decompress(data)

并且在点可能适合将其更改为:

text = gzip.decompress(data).decode('ascii')

在这里使用适合的编码(上面发布的示例数据在解压缩时只包含ascii,这可能就是你所需要的,或者你可能需要utf-8或其他一些编码,但你必须找出什么是用于编码数据,因为你不应该猜测)。但是它看起来像是包含一些管道分隔的字段,因此您可能希望首先拆分字段并解码或以其他方式单独处理它们:

fields = gzip.decompress(b).split(b'|')