UDPServer
继承: RefCounted < Object
用于实现 UDP 服务器的辅助类。
描述
简易服务器,会打开 UDP 套接字,并在收到新数据包时返回已连接的 PacketPeerUDP。另见 PacketPeerUDP.connect_to_host。
服务器启动后(listen),你需要调用 poll 按照一定的间隔轮询(例如在 Node._process 中)才能处理新数据包、将它们传递给合适的 PacketPeerUDP、获取新连接。
下面是简单的用法示例:
GDScriptC#
# 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)
{
// 针对已连接的对等体进行操作。
}
}
}
GDScriptC#
# 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。