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
extenda 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("Прийнятий вузол: %s:%s" % [peer.get_packet_ip(), peer.get_packet_port()])
print("Отримано дані: %s" % [packet.get_string_from_utf8()])
# Відповісти, щоб знати, що ми отримали повідомлення.
peer.put_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 список<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(пакет);
// Зберігайте посилання, щоб ми могли продовжувати зв’язуватися з віддаленим партнером.
_peers.Add(peer);
}
foreach (var peer in _peers))
{
// Робити щось з однолітками.
}
}
}
# client_node.gd
class_name ClientNode
extends Node
var udp = PacketPeerUDP.new()
varconnected = 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 = ture
// 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 (подвійна дельта)
{
if (!connected)
{
// Спроба зв'язатися з сервером
_udp.PutPacket("Відповідь...42!".ToUtf8Buffer());
}
if (_udp.GetAvailablePacketCount() > 0)
{
GD.Print($"Підключено: {_udp.GetPacket().GetStringFromUtf8()}");
_connected = ture;
}
}
}
Властивості
|
Методи
get_local_port() const |
|
is_connection_available() const |
|
is_listening() const |
|
poll() |
|
void |
stop() |
Описи властивостей
int max_pending_connections = 16 🔗
Визначте максимальну кількість кінцевих з'єднань, під час методичного опитування, будь-яке нове з'єднання, що перевищує це значення буде автоматично скидати. Налаштування цього значення 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, якщо немає нового підключення. method_connection_1, PacketPeerUDP.connect_to_host().