DTLSServer

继承: RefCounted < Object

实现 DTLS 服务器的辅助类。

描述

该类用于存储 DTLS 服务器的状态。在 setup 之后,它将连接的 PacketPeerUDP 转换为 PacketPeerDTLS,通过 take_connection 接受它们作为 DTLS 客户端。在底层,这个类用于存储服务器的 DTLS 状态和 cookie。为什么需要状态和 cookie 的原因不在本文档的范围内。

下面是一个如何使用它的小例子:

GDScriptC#

  1. # server_node.gd
  2. extends Node
  3. var dtls := DTLSServer.new()
  4. var server := UDPServer.new()
  5. var peers = []
  6. func _ready():
  7. server.listen(4242)
  8. var key = load("key.key") # 你的私钥。
  9. var cert = load("cert.crt") # 你的 X509 证书。
  10. dtls.setup(key, cert)
  11. func _process(delta):
  12. while server.is_connection_available():
  13. var peer: PacketPeerUDP = server.take_connection()
  14. var dtls_peer: PacketPeerDTLS = dtls.take_connection(peer)
  15. if dtls_peer.get_status() != PacketPeerDTLS.STATUS_HANDSHAKING:
  16. continue # 由于 cookie 交换,50% 的连接会失败,这是正常现象。
  17. print("对等体已连接!")
  18. peers.append(dtls_peer)
  19. for p in peers:
  20. p.poll() # 必须轮询以更新状态。
  21. if p.get_status() == PacketPeerDTLS.STATUS_CONNECTED:
  22. while p.get_available_packet_count() > 0:
  23. print("从客户端收到消息:%s" % p.get_packet().get_string_from_utf8())
  24. p.put_packet("你好 DTLS 客户端".to_utf8_buffer())
  1. // ServerNode.cs
  2. using Godot;
  3. public partial class ServerNode : Node
  4. {
  5. private DtlsServer _dtls = new DtlsServer();
  6. private UdpServer _server = new UdpServer();
  7. private Godot.Collections.Array<PacketPeerDTLS> _peers = new Godot.Collections.Array<PacketPeerDTLS>();
  8. public override void _Ready()
  9. {
  10. _server.Listen(4242);
  11. var key = GD.Load<CryptoKey>("key.key"); // 你的私钥。
  12. var cert = GD.Load<X509Certificate>("cert.crt"); // 你的 X509 证书。
  13. _dtls.Setup(key, cert);
  14. }
  15. public override void _Process(double delta)
  16. {
  17. while (Server.IsConnectionAvailable())
  18. {
  19. PacketPeerUDP peer = _server.TakeConnection();
  20. PacketPeerDTLS dtlsPeer = _dtls.TakeConnection(peer);
  21. if (dtlsPeer.GetStatus() != PacketPeerDtls.Status.Handshaking)
  22. {
  23. continue; // 由于 cookie 交换,50% 的连接会失败,这是正常现象。
  24. }
  25. GD.Print("对等体已连接!");
  26. _peers.Add(dtlsPeer);
  27. }
  28. foreach (var p in _peers)
  29. {
  30. p.Poll(); // 必须轮询以更新状态。
  31. if (p.GetStatus() == PacketPeerDtls.Status.Connected)
  32. {
  33. while (p.GetAvailablePacketCount() > 0)
  34. {
  35. GD.Print($"从客户端收到消息:{p.GetPacket().GetStringFromUtf8()}");
  36. p.PutPacket("你好 DTLS 客户端".ToUtf8Buffer());
  37. }
  38. }
  39. }
  40. }
  41. }

GDScriptC#

  1. # client_node.gd
  2. extends Node
  3. var dtls := PacketPeerDTLS.new()
  4. var udp := PacketPeerUDP.new()
  5. var connected = false
  6. func _ready():
  7. udp.connect_to_host("127.0.0.1", 4242)
  8. dtls.connect_to_peer(udp, false) # 生产环境中请使用 true 进行证书校验!
  9. func _process(delta):
  10. dtls.poll()
  11. if dtls.get_status() == PacketPeerDTLS.STATUS_CONNECTED:
  12. if !connected:
  13. # 尝试联系服务器
  14. dtls.put_packet("回应是… 42!".to_utf8_buffer())
  15. while dtls.get_available_packet_count() > 0:
  16. print("已连接:%s" % dtls.get_packet().get_string_from_utf8())
  17. connected = true
  1. // ClientNode.cs
  2. using Godot;
  3. using System.Text;
  4. public partial class ClientNode : Node
  5. {
  6. private PacketPeerDtls _dtls = new PacketPeerDtls();
  7. private PacketPeerUdp _udp = new PacketPeerUdp();
  8. private bool _connected = false;
  9. public override void _Ready()
  10. {
  11. _udp.ConnectToHost("127.0.0.1", 4242);
  12. _dtls.ConnectToPeer(_udp, validateCerts: false); // 生产环境中请使用 true 进行证书校验!
  13. }
  14. public override void _Process(double delta)
  15. {
  16. _dtls.Poll();
  17. if (_dtls.GetStatus() == PacketPeerDtls.Status.Connected)
  18. {
  19. if (!_connected)
  20. {
  21. // 尝试联系服务器
  22. _dtls.PutPacket("回应是… 42!".ToUtf8Buffer());
  23. }
  24. while (_dtls.GetAvailablePacketCount() > 0)
  25. {
  26. GD.Print($"已连接:{_dtls.GetPacket().GetStringFromUtf8()}");
  27. _connected = true;
  28. }
  29. }
  30. }
  31. }

方法

Error

setup ( TLSOptions server_options )

PacketPeerDTLS

take_connection ( PacketPeerUDP udp_peer )


方法说明

Error setup ( TLSOptions server_options )

设置 DTLS 服务器以使用给定的 server_options。请参阅 TLSOptions.server


PacketPeerDTLS take_connection ( PacketPeerUDP udp_peer )

尝试与给定 udp_peer 启动 DTLS 握手,必须已连接到该 udp_peer(请参阅 PacketPeerUDP.connect_to_host)。

注意:必须检查返回的 PacketPeerUDP 的状态是否为 PacketPeerDTLS.STATUS_HANDSHAKING,因为正常情况下,50% 的新连接会因为 cookie 交换而无效。

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.