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.
Checking the stable version of the documentation...
DTLSServer
Наследует: RefCounted < Object
Вспомогательный класс для реализации сервера DTLS.
Описание
Этот класс используется для хранения состояния сервера DTLS. После setup() он преобразует подключенные PacketPeerUDP в PacketPeerDTLS, принимая их через take_connection() как клиентов DTLS. Под капотом этот класс используется для хранения состояния DTLS и файлов cookie сервера. Причина, по которой необходимы состояние и файлы cookie, выходит за рамки этой документации.
Ниже приведен небольшой пример того, как его использовать:
# server_node.gd
extends Node
var dtls = DTLSServer.new()
var server = UDPServer.new()
var peers = []
func _ready():
server.listen(4242)
var key = load("key.key") # Ваш закрытый ключ.
var cert = load("cert.crt") # Ваш сертификат X509.
dtls.setup(TlsOptions.server(key, cert))
func _process(delta):
while server.is_connection_available():
var peer = server.take_connection()
var dtls_peer = dtls.take_connection(peer)
if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:
continue # It is normal that 50% of the connections fails due to cookie exchange.
print("Peer connected!")
peers.append(dtls_peer)
for p in peers:
p.poll() # Must poll to update the state.
if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:
while p.get_available_packet_count() > 0:
print("Received message from client: %s" % p.get_packet().get_string_from_utf8())
p.put_packet("Hello DTLS client".to_utf8_buffer())
// ServerNode.cs
using Godot;
public partial class ServerNode : Node
{
private DtlsServer _dtls = new DtlsServer();
private UdpServer _server = new UdpServer();
private Godot.Collections.Array<PacketPeerDtls> _peers = [];
public override void _Ready()
{
_server.Listen(4242);
var key = GD.Load<CryptoKey>("key.key"); // Ваш закрытый ключ.
var cert = GD.Load<X509Certificate>("cert.crt"); // Ваш сертификат X509.
_dtls.Setup(TlsOptions.Server(key, cert));
}
public override void _Process(double delta)
{
while (_server.IsConnectionAvailable())
{
PacketPeerUdp peer = _server.TakeConnection();
PacketPeerDtls dtlsPeer = _dtls.TakeConnection(peer);
if (dtlsPeer.GetStatus() != PacketPeerDtls.Status.Handshaking)
{
continue; // It is normal that 50% of the connections fails due to cookie exchange.
}
GD.Print("Peer connected!");
_peers.Add(dtlsPeer);
}
foreach (var p in _peers)
{
p.Poll(); // Must poll to update the state.
if (p.GetStatus() == PacketPeerDtls.Status.Connected)
{
while (p.GetAvailablePacketCount() > 0)
{
GD.Print($"Received Message From Client: {p.GetPacket().GetStringFromUtf8()}");
p.PutPacket("Hello DTLS Client".ToUtf8Buffer());
}
}
}
}
}
# client_node.gd
extends Node
var dtls = PacketPeerDTLS.new()
var udp = PacketPeerUDP.new()
var connected = false
func _ready():
udp.connect_to_host("127.0.0.1", 4242)
dtls.connect_to_peer(udp, false) # Используйте true в производстве для проверки сертификата!
func _process(delta):
dtls.poll()
if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:
if !connected:
# Попробуйте связаться с сервером
dtls.put_packet("The answer is... 42!".to_utf8_buffer())
while dtls.get_available_packet_count() > 0:
print("Connected: %s" % dtls.get_packet().get_string_from_utf8())
connected = true
// ClientNode.cs
using Godot;
using System.Text;
public partial class ClientNode : Node
{
private PacketPeerDtls _dtls = new PacketPeerDtls();
private PacketPeerUdp _udp = new PacketPeerUdp();
private bool _connected = false;
public override void _Ready()
{
_udp.ConnectToHost("127.0.0.1", 4242);
_dtls.ConnectToPeer(_udp, validateCerts: false); // Используйте true в производстве для проверки сертификата!
}
public override void _Process(double delta)
{
_dtls.Poll();
if (_dtls.GetStatus() == PacketPeerDtls.Status.Connected)
{
if (!_connected)
{
// Попробуйте связаться с сервером
_dtls.PutPacket("The Answer Is..42!".ToUtf8Buffer());
}
while (_dtls.GetAvailablePacketCount() > 0)
{
GD.Print($"Connected: {_dtls.GetPacket().GetStringFromUtf8()}");
_connected = true;
}
}
}
}
Методы
setup(server_options: TLSOptions) |
|
take_connection(udp_peer: PacketPeerUDP) |
Описания метода
Error setup(server_options: TLSOptions) 🔗
Настройте сервер DTLS для использования указанного server_options. См. TLSOptions.server().
PacketPeerDTLS take_connection(udp_peer: PacketPeerUDP) 🔗
Попробуйте инициировать рукопожатие DTLS с заданным udp_peer, который должен быть уже подключен (см. PacketPeerUDP.connect_to_host()).
Примечание: Вы должны проверить, что состояние возвращаемого PacketPeerUDP равно PacketPeerDTLS.STATUS_HANDSHAKING, так как нормально, что 50% новых подключений будут недействительными из-за обмена cookie-файлами.