Skip to content

WebSocket Deflate 擴充功能

Ktor 實作了適用於客戶端和伺服器的 Deflate WebSocket 擴充功能 RFC-7692。此擴充功能可以在傳送前透明地壓縮訊框,並在接收後解壓縮。如果您正在傳送大量文字資料,啟用此擴充功能會很有用。

安裝

若要使用此擴充功能,應首先安裝它。為此,我們可以在 extensions 區塊中使用 install 方法:

kotlin
// 適用於客戶端和伺服器
install(WebSockets) {
    extensions {
        install(WebSocketDeflateExtension) {
            /**
             * 用於 [java.util.zip.Deflater] 的壓縮等級。
             */
            compressionLevel = Deflater.DEFAULT_COMPRESSION

            /**
             * 防止壓縮小型傳出訊框。
             */
            compressIfBiggerThan(bytes = 4 * 1024)
        }
    }
}

進階配置參數

上下文接管

指定客戶端 (和伺服器) 是否應使用壓縮視窗。啟用這些參數可減少每個單一工作階段所分配的空間量。請注意,由於 java.util.zip.Deflater API 的限制,視窗大小無法配置。此值固定為 15

kotlin
clientNoContextTakeOver = false

serverNoContextTakeOver = false

這些參數描述於 RFC-7692 第 7.1.1 節

指定壓縮條件

若要明確指定壓縮條件,您可以使用 compressIf 方法。例如,僅壓縮文字:

kotlin
compressIf { frame ->
    frame is Frame.Text
}

在壓縮發生之前,所有對 compressIf 的呼叫都將被評估。

微調協定列表

要傳送的協定列表可以透過 configureProtocols 方法視需要編輯:

kotlin
configureProtocols { protocols ->
    protocols.clear()
    protocols.add(...)
}