UDPServer

继承: RefCounted < Object

用于实现 UDP 服务器的辅助类。

描述

简易服务器,会打开 UDP 套接字,并在收到新数据包时返回已连接的 PacketPeerUDP。另见 PacketPeerUDP.connect_to_host

服务器启动后(listen),你需要调用 poll 按照一定的间隔轮询(例如在 Node._process 中)才能处理新数据包、将它们传递给合适的 PacketPeerUDP、获取新连接。

下面是简单的用法示例:

GDScriptC#

  1. # server_node.gd
  2. class_name ServerNode
  3. extends Node
  4. var server := UDPServer.new()
  5. var peers = []
  6. func _ready():
  7. server.listen(4242)
  8. func _process(delta):
  9. server.poll() # 重要!
  10. if server.is_connection_available():
  11. var peer: PacketPeerUDP = server.take_connection()
  12. var packet = peer.get_packet()
  13. print("接受对等体:%s:%s" % [peer.get_packet_ip(), peer.get_packet_port()])
  14. print("接收到数据:%s" % [packet.get_string_from_utf8()])
  15. # 进行回复,这样对方就知道我们收到了消息。
  16. peer.put_packet(packet)
  17. # 保持引用,这样我们就能继续与远程对等体联系。
  18. peers.append(peer)
  19. for i in range(0, peers.size()):
  20. pass # 针对已连接的对等体进行操作。
  1. // ServerNode.cs
  2. using Godot;
  3. using System.Collections.Generic;
  4. public partial class ServerNode : Node
  5. {
  6. private UdpServer _server = new UdpServer();
  7. private List<PacketPeerUdp> _peers = new List<PacketPeerUdp>();
  8. public override void _Ready()
  9. {
  10. _server.Listen(4242);
  11. }
  12. public override void _Process(double delta)
  13. {
  14. _server.Poll(); // 重要!
  15. if (_server.IsConnectionAvailable())
  16. {
  17. PacketPeerUdp peer = _server.TakeConnection();
  18. byte[] packet = peer.GetPacket();
  19. GD.Print($"接受对等体:{peer.GetPacketIP()}:{peer.GetPacketPort()}");
  20. GD.Print($"接收到数据:{packet.GetStringFromUtf8()}");
  21. // 进行回复,这样对方就知道我们收到了消息。
  22. peer.PutPacket(packet);
  23. // 保持引用,这样我们就能继续与远程对等体联系。
  24. _peers.Add(peer);
  25. }
  26. foreach (var peer in _peers)
  27. {
  28. // 针对已连接的对等体进行操作。
  29. }
  30. }
  31. }

GDScriptC#

  1. # client_node.gd
  2. class_name ClientNode
  3. extends Node
  4. var udp := PacketPeerUDP.new()
  5. var connected = false
  6. func _ready():
  7. udp.connect_to_host("127.0.0.1", 4242)
  8. func _process(delta):
  9. if !connected:
  10. # 尝试连接服务器
  11. udp.put_packet("答案是……42!".to_utf8_buffer())
  12. if udp.get_available_packet_count() > 0:
  13. print("已连接:%s" % udp.get_packet().get_string_from_utf8())
  14. connected = true
  1. // ClientNode.cs
  2. using Godot;
  3. public partial class ClientNode : Node
  4. {
  5. private PacketPeerUdp _udp = new PacketPeerUdp();
  6. private bool _connected = false;
  7. public override void _Ready()
  8. {
  9. _udp.ConnectToHost("127.0.0.1", 4242);
  10. }
  11. public override void _Process(double delta)
  12. {
  13. if (!_connected)
  14. {
  15. // 尝试联系服务器
  16. _udp.PutPacket("答案是……42!".ToUtf8Buffer());
  17. }
  18. if (_udp.GetAvailablePacketCount() > 0)
  19. {
  20. GD.Print($"已连接:{_udp.GetPacket().GetStringFromUtf8()}");
  21. _connected = true;
  22. }
  23. }
  24. }

属性

int

max_pending_connections

16

方法

int

get_local_port() const

bool

is_connection_available() const

bool

is_listening() const

Error

listen(port: int, bind_address: String = “*”)

Error

poll()

void

stop()

PacketPeerUDP

take_connection()


属性说明

int max_pending_connections = 16 🔗

  • void set_max_pending_connections(value: int)

  • int get_max_pending_connections()

定义最大的待定连接数,在poll期间,任何超过该值的新待定连接将被自动放弃。把这个值设置为0可以有效地防止任何新的待定连接被接受,例如,当你的所有玩家都连接时。


方法说明

int get_local_port() const 🔗

返回该服务器正在监听的本地端口。


bool is_connection_available() const 🔗

如果在套接字中收到一个具有新地址及端口组合的数据包,则返回 true


bool is_listening() const 🔗

如果套接字是打开的,并且在监听端口,则返回 true


Error listen(port: int, bind_address: String = “*“) 🔗

启动服务器,打开监听给定端口 port 的 UDP 套接字。还可以指定 bind_address,仅监听发送至该地址的数据包。另见 PacketPeerUDP.bind


Error poll() 🔗

定期调用这个方法,例如在Node._process里面,来处理新数据包。来自已知地址及端口对的数据包,将被传递到相应的PacketPeerUDP,任何从未知地址及端口对收到的数据包将被添加为一个待定连接,参阅is_connection_available, take_connection。待定连接的最大数量通过max_pending_connections定义。


void stop() 🔗

停止服务器,如果 UDP 套接字处于打开状态,就关闭它。将关闭所有通过 take_connection 接受连接的 PacketPeerUDP(不会通知远程对等体)。


PacketPeerUDP take_connection() 🔗

返回第一个挂起的连接(连接到适当的地址及端口)。如果没有新的连接可用,将返回 null。另请参阅 is_connection_availablePacketPeerUDP.connect_to_host