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 = server.take_connection()
var packet = peer.get_packet()
print("Accepted peer: %s:%s" % [peer.get_packet_ip(), peer.get_packet_port()])
print("Received data: %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($"Accepted Peer: {peer.GetPacketIP()}:{peer.GetPacketPort()}");
GD.Print($"Received Data: {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("The answer is... 42!".to_utf8_buffer())
if udp.get_available_packet_count() > 0:
print("Connected: %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("The Answer Is..42!".ToUtf8Buffer());
}
if (_udp.GetAvailablePacketCount() > 0)
{
GD.Print($"Connected: {_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 = "*") 🔗
Запускает сервер, открывая сокет UDP, прослушивающий указанный port. Вы можете дополнительно указать bind_address, чтобы прослушивать только пакеты, отправленные на этот адрес. См. также PacketPeerUDP.bind().
Вызывайте этот метод через регулярные интервалы (например, внутри Node._process()) для обработки новых пакетов. Любой пакет из известной пары адрес/порт будет доставлен в соответствующий PacketPeerUDP, тогда как любой пакет, полученный из неизвестной пары адрес/порт, будет добавлен как ожидающее соединение (см. is_connection_available() и take_connection()). Максимальное количество ожидающих соединений определяется через max_pending_connections.
void stop() 🔗
Останавливает сервер, закрывая сокет UDP, если он открыт. Закроет все подключенные PacketPeerUDP, принятые через take_connection() (удаленные пиры не будут уведомлены).
PacketPeerUDP take_connection() 🔗
Возвращает первое ожидающее соединение (подключенное к соответствующему адресу/порту). Возвращает null, если новое соединение недоступно. См. также is_connection_available(), PacketPeerUDP.connect_to_host().