コンテンツにスキップ

WebSockets

WebSocketsは、クライアントとサーバー間の双方向通信を可能にします。リクエストとレスポンスのパターンを持つHTTPとは異なり、WebSocketのピアは任意の数のメッセージを双方向に送信できます。VaporのWebSocket APIを使用すると、メッセージを非同期に処理するクライアントとサーバーの両方を作成できます。

サーバー

WebSocketエンドポイントは、Routing APIを使用して既存のVaporアプリケーションに追加できます。getpostを使用するのと同じようにwebSocketメソッドを使用します。

app.webSocket("echo") { req, ws in
    // 接続されたWebSocket
    print(ws)
}

WebSocketルートは、通常のルートと同様にグループ化し、ミドルウェアで保護できます。

WebSocketハンドラーは、受信HTTPリクエストを受け入れるだけでなく、新しく確立されたWebSocket接続も受け入れます。このWebSocketを使用してメッセージを送受信する方法については、以下を参照してください。

クライアント

リモートのWebSocketエンドポイントに接続するには、WebSocket.connectを使用します。

WebSocket.connect(to: "ws://echo.websocket.org", on: eventLoop) { ws in
    // 接続されたWebSocket
    print(ws)
}

connectメソッドは、接続が確立されたときに完了するfutureを返します。接続されると、新しく接続されたWebSocketで提供されたクロージャが呼び出されます。このWebSocketを使用してメッセージを送受信する方法については、以下を参照してください。

メッセージ

WebSocketクラスには、メッセージの送受信やクローズなどのイベントのリスニングのためのメソッドがあります。WebSocketは、テキストとバイナリの2つのプロトコルでデータを送信できます。テキストメッセージはUTF-8文字列として解釈され、バイナリデータはバイト配列として解釈されます。

送信

メッセージはWebSocketのsendメソッドを使用して送信できます。

ws.send("Hello, world")

このメソッドにStringを渡すと、テキストメッセージが送信されます。[UInt8]を渡すことでバイナリメッセージを送信できます。

ws.send([1, 2, 3])

メッセージの送信は非同期です。sendメソッドにEventLoopPromiseを提供して、メッセージの送信が完了したか失敗したかを通知できます。

let promise = eventLoop.makePromise(of: Void.self)
ws.send(..., promise: promise)
promise.futureResult.whenComplete { result in
    // 送信に成功または失敗
}

async/awaitを使用している場合は、awaitを使用して非同期操作の完了を待つことができます。

try await ws.send(...)

受信

受信メッセージはonTextonBinaryコールバックで処理されます。

ws.onText { ws, text in
    // このWebSocketが受信した文字列
    print(text)
}

ws.onBinary { ws, binary in
    // このWebSocketが受信した[UInt8]
    print(binary)
}

参照サイクルを防ぐため、WebSocket自体がこれらのコールバックの最初のパラメータとして提供されます。データを受信した後、WebSocketに対してアクションを実行するには、この参照を使用します。例えば、返信を送信する場合:

// 受信したメッセージをエコーバック
ws.onText { ws, text in
    ws.send(text)
}

クローズ

WebSocketを閉じるには、closeメソッドを呼び出します。

ws.close()

このメソッドは、WebSocketが閉じられたときに完了するfutureを返します。sendと同様に、このメソッドにpromiseを渡すこともできます。

ws.close(promise: nil)

または、async/awaitを使用している場合はawaitできます:

try await ws.close()

ピアが接続を閉じたときに通知を受けるには、onCloseを使用します。このfutureは、クライアントまたはサーバーがWebSocketを閉じたときに完了します。

ws.onClose.whenComplete { result in
    // クローズに成功または失敗
}

closeCodeプロパティは、WebSocketが閉じられたときに設定されます。これを使用して、ピアが接続を閉じた理由を判断できます。

Ping / Pong

PingとPongメッセージは、WebSocket接続を維持するためにクライアントとサーバーによって自動的に送信されます。アプリケーションはonPingonPongコールバックを使用してこれらのイベントをリッスンできます。

ws.onPing { ws in 
    // Pingを受信
}

ws.onPong { ws in
    // Pongを受信
}