Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

WebSocket

HTML5 und WebSocket

Das WebSocket-Protokoll wurde 2011 mit dem ursprünglichen Ziel standardisiert, dass Browser stabile und bidirektionale Verbindungen mit einem Server herstellen können. Zuvor unterstützten Browser nur HTTPRequests, was für die bidirektionale Kommunikation nicht gut geeignet ist.

Das Protokoll ist nachrichtenbasiert und ein sehr leistungsfähiges Werkzeug, um Push-Benachrichtigungen an Browser zu senden, und wurde zur Implementierung von Chats, rundenbasierten Spielen usw. verwendet. Es verwendet immer noch eine TCP-Verbindung, die gut für die Zuverlässigkeit, aber nicht für die Latenz ist, also nicht gut für Echtzeitanwendungen wie VoIP und schnelle Spiele (siehe WebRTC für diese Anwendungsfälle).

Aufgrund seiner Einfachheit, seiner breiten Kompatibilität und seiner einfacheren Verwendung als eine direkte TCP-Verbindung verbreitete sich WebSocket bald außerhalb der Browser in nativen Anwendungen, um mit Netzwerkservern zu kommunizieren.

Godot unterstützt WebSocket sowohl beim nativen als auch beim HTML5-Export.

Verwenden von WebSocket in Godot

WebSocket is implemented in Godot via WebSocketPeer. The WebSocket implementation is compatible with the High-Level Multiplayer. See section on high-level multiplayer for more details.

Warnung

Wenn Sie nach Android exportieren, stellen Sie sicher, dass Sie die Berechtigung INTERNET in der Android-Exportvorgabe aktivieren, bevor Sie das Projekt exportieren oder die Ein-Klick-Auslieferung verwenden. Andernfalls wird jede Art von Netzwerkkommunikation von Android blockiert.

Minimales Client-Beispiel

In diesem Beispiel wird gezeigt, wie Sie eine WebSocket-Verbindung zu einem Remoteserver herstellen und wie Sie Daten senden und empfangen können.

extends Node

# The URL we will connect to.
@export var websocket_url = "wss://echo.websocket.org"

# Our WebSocketClient instance.
var socket = WebSocketPeer.new()

func _ready():
    # Initiate connection to the given URL.
    var err = socket.connect_to_url(websocket_url)
    if err != OK:
        print("Unable to connect")
        set_process(false)
    else:
        # Wait for the socket to connect.
        await get_tree().create_timer(2).timeout

        # Send data.
        socket.send_text("Test packet")

func _process(_delta):
    # Call this in _process or _physics_process. Data transfer and state updates
    # will only happen when calling this function.
    socket.poll()

    # get_ready_state() tells you what state the socket is in.
    var state = socket.get_ready_state()

    # WebSocketPeer.STATE_OPEN means the socket is connected and ready
    # to send and receive data.
    if state == WebSocketPeer.STATE_OPEN:
        while socket.get_available_packet_count():
            print("Got data from server: ", socket.get_packet().get_string_from_utf8())

    # WebSocketPeer.STATE_CLOSING means the socket is closing.
    # It is important to keep polling for a clean close.
    elif state == WebSocketPeer.STATE_CLOSING:
        pass

    # WebSocketPeer.STATE_CLOSED means the connection has fully closed.
    # It is now safe to stop polling.
    elif state == WebSocketPeer.STATE_CLOSED:
        # The code will be -1 if the disconnection was not properly notified by the remote peer.
        var code = socket.get_close_code()
        print("WebSocket closed with code: %d. Clean: %s" % [code, code != -1])
        set_process(false) # Stop processing.

Dies wird etwas ähnliches wie das Folgende ausgeben:

Got data from server: Request served by 7811941c69e658
Got data from server: Test packet

Minimales Server-Beispiel

Dieses Beispiel zeigt Ihnen, wie Sie einen WebSocket-Server erstellen, der auf Remote-Verbindungen wartet, und wie Sie Daten senden und empfangen.

extends Node

# The port we will listen to
const PORT = 9080
# Our WebSocketServer instance
var _server = WebSocketServer.new()

func _ready():
    # Connect base signals to get notified of new client connections,
    # disconnections, and disconnect requests.
    _server.client_connected.connect(_connected)
    _server.client_disconnected.connect(_disconnected)
    _server.client_close_request.connect(_close_request)
    # This signal is emitted when not using the Multiplayer API every time a
    # full packet is received.
    # Alternatively, you could check get_peer(PEER_ID).get_available_packets()
    # in a loop for each connected peer.
    _server.data_received.connect(_on_data)
    # Start listening on the given port.
    var err = _server.listen(PORT)
    if err != OK:
        print("Unable to start server")
        set_process(false)

func _connected(id, proto):
    # This is called when a new peer connects, "id" will be the assigned peer id,
    # "proto" will be the selected WebSocket sub-protocol (which is optional)
    print("Client %d connected with protocol: %s" % [id, proto])

func _close_request(id, code, reason):
    # This is called when a client notifies that it wishes to close the connection,
    # providing a reason string and close code.
    print("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason])

func _disconnected(id, was_clean = false):
    # This is called when a client disconnects, "id" will be the one of the
    # disconnecting client, "was_clean" will tell you if the disconnection
    # was correctly notified by the remote peer before closing the socket.
    print("Client %d disconnected, clean: %s" % [id, str(was_clean)])

func _on_data(id):
    # Print the received packet, you MUST always use get_peer(id).get_packet to receive data,
    # and not get_packet directly when not using the MultiplayerAPI.
    var pkt = _server.get_peer(id).get_packet()
    print("Got data from client %d: %s ... echoing" % [id, pkt.get_string_from_utf8()])
    _server.get_peer(id).put_packet(pkt)

func _process(delta):
    # Call this in _process or _physics_process.
    # Data transfer, and signals emission will only happen when calling this function.
    _server.poll()

Dadurch wird (wenn ein Client eine Verbindung herstellt) etwas Ähnliches wie folgendes ausgegeben:

Client 1348090059 connected with protocol: selected-protocol
Got data from client 1348090059: Test packet ... echoing

Fortgeschrittene Chat-Demo

A more advanced chat demo which optionally uses the multiplayer mid-level abstraction and a high-level multiplayer demo are available in the godot demo projects under networking/websocket_chat and networking/websocket_multiplayer.