WebRTC

    This is a great opportunity for both demos and full games, but used to come with some limitations. In the area of networking, browsers used to support only HTTPRequests until recently, when first WebSocket and then WebRTC were proposed as standards.

    When the WebSocket protocol was standardized in December 2011, it allowed browsers to create stable and bidirectional connections to a WebSocket server. The protocol is quite simple, but a very powerful tool to send push notifications to browsers, and has been used to implement chats, turn-based games, etc.

    WebSockets, though, still use a TCP connection, which is good for reliability but not for latency, so not good for real-time applications like VoIP and fast-paced games.

    For this reason, since 2010, Google started working on a new technology called WebRTC, which later on, in 2017, became a W3C candidate recommendation. WebRTC is a much more complex set of specifications, and relies on many other technologies behind the scenes (ICE, DTLS, SDP) to provide fast, real-time, and secure communication between two peers.

    The idea is to find the fastest route between the two peers and establish whenever possible a direct communication (i.e. try to avoid a relaying server).

    However, this comes at a price, which is that some media information must be exchanged between the two peers before the communication can start (in the form of Session Description Protocol - SDP strings). This usually takes the form of a so-called WebRTC Signaling Server.

    Peers connect to a signaling server (for example a WebSocket server) and send their media information. The server then relays this information to other peers, allowing them to establish the desired direct communication. Once this step is done, peers can disconnect from the signaling server and keep the direct Peer-to-Peer (P2P) connection open.

    Using WebRTC in Godot

    WebRTC is implemented in Godot via two main classes and WebRTCDataChannel, plus the multiplayer API implementation . See section on high-level multiplayer for more details.

    Note

    These classes are available automatically in HTML5, but require an external GDNative plugin on native (non-HTML5) platforms. Check out the for instructions and to get the latest release.

    This example will show you how to create a WebRTC connection between two peers in the same application. This is not very useful in real life, but will give you a good overview of how a WebRTC connection is set up.

    This will print:

    1. P2 received: Hi from P2

    And now for the local signaling server:

    Note

    This local signaling server is supposed to be used as a to connect two peers in the same scene.

    1. # A local signaling server. Add this to autoloads with name "Signaling" (/root/Signaling)
    2. extends Node
    3. var peers = []
    4. func register(path):
    5. assert(peers.size() < 2)
    6. peers.append(path)
    7. if peers.size() == 2:
    8. get_node(peers[0]).peer.create_offer()
    9. func _find_other(path):
    10. # Find the other registered peer.
    11. for p in peers:
    12. return p
    13. return ""
    14. var other = _find_other(path)
    15. assert(other != "")
    16. get_node(other).peer.set_remote_description(type, sdp)
    17. func send_candidate(path, mid, index, sdp):
    18. var other = _find_other(path)
    19. assert(other != "")
    20. get_node(other).peer.add_ice_candidate(mid, index, sdp)

    Then you can use it like this:

    This will print something similar to this:

    1. /root/main/@@2 received: Hi from /root/main/@@3

    A more advanced demo using WebSocket for signaling peers and WebRTCMultiplayer is available in the under networking/webrtc_signaling.