繁体   English   中英

通过Python中的TCP套接字发送gzip压缩数据

[英]Sending gzip compressed data through TCP socket in Python

我正在Python中创建一个HTTP服务器,其中没有用于学习目的的任何HTTP库。 现在,它可以很好地服务于静态文件。

我为文件提供服务的方式是通过这段代码:

with open(self.filename, 'rb') as f:
    src = f.read()
socket.sendall(src)

但是,我想通过发送压缩数据而不是未压缩数据来稍微优化其性能。 我知道我的浏览器(Chrome)接受压缩数据,因为它在标题中告诉我

Accept-Encoding: gzip, deflate, sdch

因此,我将代码更改为此

with open(self.filename, 'rb') as f:
    src = zlib.compress(f.read())
socket.sendall(src)

但这只会输出垃圾。 我究竟做错了什么?

zlib库实现了deflate压缩算法(RFC 1951)。 压缩压缩有两种封装:zlib(RFC 1950)和gzip(RFC 1952)。 这些仅在它们围绕压缩压缩数据提供的报头和尾部类型上有所不同。

zlib.compress仅提供原始的deflate数据,而没有任何标题和尾部。 要获得这些,您需要使用压缩对象。 对于gzip,它看起来像这样:

z = zlib.compressobj(-1,zlib.DEFLATED,31)
gzip_compressed_data = z.compress(data) + z.flush()

这里的重要部分是31作为compressobj的第三个参数。 这指定了gzip格式,然后可以与Content-Encoding: gzip

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM