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().