1

我在 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)

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

4

1 回答 1

5

zlib 库实现了 deflate 压缩算法 (RFC 1951)。deflate 压缩有两种封装:zlib (RFC 1950) 和 gzip (RFC 1952)。它们的区别仅在于它们围绕 deflate 压缩数据提供的标头和尾标类型。

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

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

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

于 2016-09-09T16:46:36.533 回答