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