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...
UDPServer¶
继承: RefCounted < Object
用于实现 UDP 服务器的辅助类。
描述¶
简易服务器,会打开 UDP 套接字,并在收到新数据包时返回已连接的 PacketPeerUDP。另见 PacketPeerUDP.connect_to_host。
服务器启动后(listen),你需要调用 poll 按照一定的间隔轮询(例如在 Node._process 中)才能处理新数据包、将它们传递给合适的 PacketPeerUDP、获取新连接。
下面是简单的用法示例:
# server_node.gd
class_name ServerNode
extends Node
var server := UDPServer.new()
var peers = []
func _ready():
server.listen(4242)
func _process(delta):
server.poll() # 重要!
if server.is_connection_available():
var peer: PacketPeerUDP = server.take_connection()
var packet = peer.get_packet()
print("接受对等体:%s:%s" % [peer.get_packet_ip(), peer.get_packet_port()])
print("接收到数据:%s" % [packet.get_string_from_utf8()])
# 进行回复,这样对方就知道我们收到了消息。
peer.put_packet(packet)
# 保持引用,这样我们就能继续与远程对等体联系。
peers.append(peer)
for i in range(0, peers.size()):
pass # 针对已连接的对等体进行操作。
// ServerNode.cs
using Godot;
using System.Collections.Generic;
public partial class ServerNode : Node
{
private UdpServer _server = new UdpServer();
private List<PacketPeerUdp> _peers = new List<PacketPeerUdp>();
public override void _Ready()
{
_server.Listen(4242);
}
public override void _Process(double delta)
{
_server.Poll(); // 重要!
if (_server.IsConnectionAvailable())
{
PacketPeerUdp peer = _server.TakeConnection();
byte[] packet = peer.GetPacket();
GD.Print($"接受对等体:{peer.GetPacketIP()}:{peer.GetPacketPort()}");
GD.Print($"接收到数据:{packet.GetStringFromUtf8()}");
// 进行回复,这样对方就知道我们收到了消息。
peer.PutPacket(packet);
// 保持引用,这样我们就能继续与远程对等体联系。
_peers.Add(peer);
}
foreach (var peer in _peers)
{
// 针对已连接的对等体进行操作。
}
}
}
# client_node.gd
class_name ClientNode
extends Node
var udp := PacketPeerUDP.new()
var connected = false
func _ready():
udp.connect_to_host("127.0.0.1", 4242)
func _process(delta):
if !connected:
# 尝试连接服务器
udp.put_packet("答案是……42!".to_utf8_buffer())
if udp.get_available_packet_count() > 0:
print("已连接:%s" % udp.get_packet().get_string_from_utf8())
connected = true
// ClientNode.cs
using Godot;
public partial class ClientNode : Node
{
private PacketPeerUdp _udp = new PacketPeerUdp();
private bool _connected = false;
public override void _Ready()
{
_udp.ConnectToHost("127.0.0.1", 4242);
}
public override void _Process(double delta)
{
if (!_connected)
{
// 尝试联系服务器
_udp.PutPacket("答案是……42!".ToUtf8Buffer());
}
if (_udp.GetAvailablePacketCount() > 0)
{
GD.Print($"已连接:{_udp.GetPacket().GetStringFromUtf8()}");
_connected = true;
}
}
}
属性¶
|
方法¶
get_local_port() const |
|
is_connection_available() const |
|
is_listening() const |
|
poll() |
|
void |
stop() |
属性说明¶
int max_pending_connections = 16
🔗
定义最大的待定连接数,在poll期间,任何超过该值的新待定连接将被自动放弃。把这个值设置为0
可以有效地防止任何新的待定连接被接受,例如,当你的所有玩家都连接时。
方法说明¶
返回该服务器正在监听的本地端口。
bool is_connection_available() const 🔗
如果在套接字中收到一个具有新地址及端口组合的数据包,则返回 true
。
如果套接字是打开的,并且在监听端口,则返回 true
。
Error listen(port: int, bind_address: String = "*") 🔗
启动服务器,打开监听给定端口 port
的 UDP 套接字。还可以指定 bind_address
,仅监听发送至该地址的数据包。另见 PacketPeerUDP.bind。
定期调用这个方法,例如在Node._process里面,来处理新数据包。来自已知地址及端口对的数据包,将被传递到相应的PacketPeerUDP,任何从未知地址及端口对收到的数据包将被添加为一个待定连接,参阅is_connection_available, take_connection。待定连接的最大数量通过max_pending_connections定义。
void stop() 🔗
停止服务器,如果 UDP 套接字处于打开状态,就关闭它。将关闭所有通过 take_connection 接受连接的 PacketPeerUDP(不会通知远程对等体)。
PacketPeerUDP take_connection() 🔗
返回第一个挂起的连接(连接到适当的地址及端口)。如果没有新的连接可用,将返回 null
。另请参阅 is_connection_available、PacketPeerUDP.connect_to_host。