1

学習目的で、HTTP ライブラリを使用せずに Python で 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) の 2 つのカプセル化があります。これらは、deflate 圧縮データの周りに提供するヘッダーとトレーラーの種類のみが異なります。

zlib.compressヘッダーとトレーラーなしで、生の収縮データのみを提供します。これらを取得するには、圧縮オブジェクトを使用する必要があります。gzip の場合、これは次のようになります。

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

ここで重要な部分は、31の 3 番目の引数としてのcompressobjです。これにより、 で使用できる gzip 形式が指定されますContent-Encoding: gzip

于 2016-09-09T16:46:36.533 に答える