我使用DeflateStream
這樣實現的WebSocket壓縮:如何在多個數據塊上使用DeflateStream?
public byte[] Compress(Stream input)
{
using (var compressStream = new MemoryStream())
using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
{
input.CopyTo(compressor);
compressor.Close();
return compressStream.ToArray();
}
}
這對於第一條消息能正常工作,但我需要保持同樣的壓縮上下文(LZ77滑動窗口),並重新使用它的第二個消息,而不是每次都以新詞典開始。
我目前的解決方法是設置Websockets client_no_context_takeover
和server_no_context_takeover
選項,讓對方知道我們不是在循環放氣狀態。
那麼我怎樣才能改變上面的代碼,以便它保留下一次調用deflate'狀態'?
你可以從內存中讀取它在壓縮器中仍然打開的狀態,而不是將其轉換爲數組? – ths 2014-09-03 17:27:25
@speising我這麼認爲。但是壓縮器在調用Close()之前不會刷新任何內存流。 – Muis 2014-09-03 18:01:19
這是一個微型優化,違背了所有向WebSockets添加壓縮的提議。所有不好主意的母親。 – 2014-09-03 21:53:36