Ga naar inhoud

WebSockets

WebSockets maken tweerichtingscommunicatie tussen een client en server mogelijk. In tegenstelling tot HTTP, dat een verzoek en antwoord patroon heeft, kunnen WebSocket peers een willekeurig aantal berichten in beide richtingen sturen. Vapor's WebSocket API maakt het mogelijk om zowel clients als servers te maken die berichten asynchroon afhandelen.

Server

WebSocket endpoints kunnen worden toegevoegd aan uw bestaande Vapor applicatie met behulp van de Routing API. Gebruik de webSocket methode zoals u get of post zou gebruiken.

app.webSocket("echo") { req, ws in
    // Verbonden WebSocket.
    print(ws)
}

WebSocket routes kunnen worden gegroepeerd en worden beschermd door middleware zoals normale routes.

Naast het accepteren van het inkomende HTTP verzoek, accepteren WebSocket handlers ook de nieuw opgezette WebSocket verbinding. Zie hieronder voor meer informatie over het gebruik van deze WebSocket voor het verzenden en lezen van berichten.

Client

Om verbinding te maken met een WebSocket eindpunt op afstand, gebruik WebSocket.connect.

WebSocket.connect(to: "ws://echo.websocket.org", on: eventLoop) { ws in
    // Verbonden WebSocket.
    print(ws)
}

De connect methode retourneert een future die wordt afgesloten als de verbinding tot stand is gebracht. Eenmaal verbonden zal de meegeleverde closure aangeroepen worden met de zojuist verbonden WebSocket. Zie hieronder voor meer informatie over het gebruik van deze WebSocket om berichten te versturen en te lezen.

Berichten

De WebSocket klasse heeft methoden voor het zenden en ontvangen van berichten en voor het luisteren naar gebeurtenissen zoals sluiting. WebSockets kunnen gegevens verzenden via twee protocollen: tekst en binair. Tekst berichten worden geïnterpreteerd als UTF-8 strings, terwijl binaire gegevens worden geïnterpreteerd als een array van bytes.

Versturen

Berichten kunnen worden verzonden met de WebSocket send methode.

ws.send("Hello, world")

Het doorgeven van een String aan deze methode resulteert in het versturen van een tekst bericht. Binaire berichten kunnen worden verzonden door een [UInt8] door te geven.

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

Het verzenden van berichten is asynchroon. Je kunt een EventLoopPromise meegeven aan de send method om een bericht te krijgen wanneer het bericht klaar is met verzenden of wanneer het verzenden mislukt is.

let promise = eventLoop.makePromise(of: Void.self)
ws.send(..., promise: promise)
promise.futureResult.whenComplete { result in
    // Is gelukt of niet gelukt om te verzenden.
}

Als u async/await gebruikt kunt u "wachten" op het resultaat

// TODO Check this actually works
let result = try await ws.send(...)

Ontvangen

Inkomende berichten worden afgehandeld via de onText en onBinary callbacks.

ws.onText { ws, text in
    // String ontvangen door deze WebSocket.
    print(text)
}

ws.onBinary { ws, binary in
    // [UInt8] ontvangen door deze WebSocket.
    print(binary)
}

De WebSocket zelf wordt als eerste parameter aan deze callbacks meegegeven om referentie cycli te voorkomen. Gebruik deze referentie om actie te ondernemen op de WebSocket na ontvangst van data. Bijvoorbeeld om een antwoord te sturen:

// Echo's van ontvangen berichten.
ws.onText { ws, text in
    ws.send(text)
}

Afsluiten

Om een WebSocket af te sluiten, roep de close methode op.

ws.close()

Deze methode retourneert een future die voltooid zal worden als de WebSocket gesloten is. Net als send, mag je ook een promise doorgeven aan deze methode.

ws.close(promise: nil)

Of "wacht" erop als je async/await gebruikt:

try await ws.close()

Om een melding te krijgen wanneer de peer de verbinding sluit, gebruik onClose. Deze future wordt uitgevoerd wanneer ofwel de client ofwel de server de WebSocket sluit.

ws.onClose.whenComplete { result in
    // Geslaagd of mislukt om te sluiten.
}

De closeCode eigenschap wordt ingesteld wanneer de WebSocket sluit. Dit kan gebruikt worden om te bepalen waarom de peer de verbinding heeft gesloten.

Ping / Pong

Ping en pong berichten worden automatisch verzonden door de client en server om WebSocket verbindingen in leven te houden. Je applicatie kan luisteren naar deze events door gebruik te maken van de onPing en onPong callbacks.

ws.onPing { ws in 
    // Ping is ontvangen.
}

ws.onPong { ws in
    // Pong werd ontvangen.
}