在 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) 接受压缩数据,因为它在 header
中告诉我
Accept-Encoding: gzip, deflate, sdch
所以,我将代码更改为这个
with open(self.filename, 'rb') as f:
src = zlib.compress(f.read())
socket.sendall(src)
但这只会输出垃圾。我做错了什么?
zlib 库实现了 deflate 压缩算法 (RFC 1951)。 deflate 压缩有两种封装:zlib (RFC 1950) 和 gzip (RFC 1952)。它们的不同之处仅在于它们围绕 deflate 压缩数据提供的 header 和预告片。
zlib.compress
仅提供原始压缩数据,没有任何 header 和预告片。要获得这些,您需要使用压缩 object。对于 gzip,它看起来像这样:
z = zlib.compressobj(-1,zlib.DEFLATED,31)
gzip_compressed_data = z.compress(data) + z.flush()
这里的重要部分是 31
作为 compressobj
的第三个参数。这指定了 gzip 格式,然后可以与 Content-Encoding: gzip
一起使用。
我正在 Python 中创建一个没有任何 HTTP 库的 HTTP 服务器用于学习目的。现在它可以很好地提供静态文件。
我提供文件的方式是通过这段代码:
with open(self.filename, 'rb') as f:
src = f.read()
socket.sendall(src)
但是,我想通过发送压缩数据而不是未压缩数据来优化它的性能。我知道我的浏览器 (Chrome) 接受压缩数据,因为它在 header
中告诉我Accept-Encoding: gzip, deflate, sdch
所以,我将代码更改为这个
with open(self.filename, 'rb') as f:
src = zlib.compress(f.read())
socket.sendall(src)
但这只会输出垃圾。我做错了什么?
zlib 库实现了 deflate 压缩算法 (RFC 1951)。 deflate 压缩有两种封装:zlib (RFC 1950) 和 gzip (RFC 1952)。它们的不同之处仅在于它们围绕 deflate 压缩数据提供的 header 和预告片。
zlib.compress
仅提供原始压缩数据,没有任何 header 和预告片。要获得这些,您需要使用压缩 object。对于 gzip,它看起来像这样:
z = zlib.compressobj(-1,zlib.DEFLATED,31)
gzip_compressed_data = z.compress(data) + z.flush()
这里的重要部分是 31
作为 compressobj
的第三个参数。这指定了 gzip 格式,然后可以与 Content-Encoding: gzip
一起使用。