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-файлами.