WebSockets in Ktor Client
WebSocket is a protocol which provides a full-duplex communication session between the user's browser and a server over a single TCP connection. It is particularly useful for creating applications that require real-time data transfer from and to the server.
Ktor supports the WebSocket protocol both on the server-, and the client-side.
The Websockets plugin for the client allows you to handle a WebSocket session for exchanging messages with a server.
Add dependencies
To use WebSockets, you need to include the ktor-client-websockets artifact in the build script:
You can learn more about artifacts required by the Ktor client from Adding client dependencies.
Install WebSockets
To install the WebSockets plugin, pass it to the install function inside a client configuration block:
Configuration
Optionally, you can configure the plugin inside the install block by passing the supported properties of the WebSockets.Config.
maxFrameSizeSet a maximum
Framesize that could be received or sent.contentConverterSet a converter for serialization/deserialization.
pingIntervalMillisSpecify the duration between pings in a
Longformat.pingIntervalSpecify the duration between pings in a
Durationformat.
In the following example, the WebSockets plugin is configured with a ping interval of 20 seconds (20_000 milliseconds) to automatically send ping frames and keep the WebSocket connection alive:
Working with WebSocket sessions
A client's WebSocket session is represented by the DefaultClientWebSocketSession interface. This interface exposes the API that allows you to send and receive WebSocket frames, and close a session.
Access a WebSocket session
HttpClient provides two primary ways to access a WebSocket session:
The webSocket() function accepts
DefaultClientWebSocketSessionas a block argument.runBlocking { client.webSocket( method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/echo" ) { // this: DefaultClientWebSocketSession } }The webSocketSession() function returns the
DefaultClientWebSocketSessioninstance and allows you to access a session outside therunBlockingorlaunchscope.
Handle WebSocket sessions
Within the function block, you define the handler for the specified path. The following functions and properties are available within the block:
send()Use the
send()function to send text content to the server.outgoingUse the
outgoingproperty to access the channels for sending WebSocket frames. A frame is represented by theFrameclass.incomingUse the
incomingproperty to access the channels for receiving WebSocket frames. A frame is represented by theFrameclass.close()Use the
close()function to send a close frame with the specified reason.
Frame types
You can inspect the type of WebSocket frame and handle it accordingly. Some common frame types are:
Frame.Textrepresents a text frame. UseFrame.Text.readText()to read its content.Frame.Binaryrepresents a binary frame. UseFrame.Binary.readBytes()to read its content.Frame.Closerepresents a closing frame. UseFrame.Close.readReason()to get the reason for the session's closure.
Example
The example below creates the echo WebSocket endpoint and shows how to send and receive a message to and from a server.
For the full example, see client-websockets.