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¶
Inherits: RefCounted < Object
用于实现 UDP 服务器的辅助类。
Description¶
简易服务器,会打开 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;
}
}
}
Properties¶
|
Methods¶
get_local_port ( ) const |
|