:github_url: hide .. _class_UDPServer: UDPServer ========= **Успадковує:** :ref:`RefCounted` **<** :ref:`Object` Допоможець класу для реалізації сервера UDP. .. rst-class:: classref-introduction-group Опис -------- Простий сервер, який відкриває UDP-сокет і повертає підключений :ref:`PacketPeerUDP` після отримання нових пакетів. Дивіться також :ref:`PacketPeerUDP.connect_to_host()`. Після запуску сервера (:ref:`listen()`) вам потрібно буде :ref:`poll()` проводити його через регулярні проміжки часу (наприклад, усередині :ref:`Node._process()`), щоб він обробляв нові пакети, доставляючи їх до відповідного :ref:`PacketPeerUDP` і встановлюючи нові з’єднання. Нижче наведено невеликий приклад того, як це можна використовувати: .. tabs:: .. code-tab:: gdscript # 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 # Зробіть щось із підключеними одноранговими вузлами. .. code-tab:: csharp // ServerNode.cs using Godot using System.Collections.Generic; public partial class ServerNode : Node { private UdpServer _server = new UdpServer(); private List _peers = new список(); 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)) { // Робити щось з однолітками. } } } .. tabs:: .. code-tab:: gdscript # 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 .. code-tab:: csharp // 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; } } } .. rst-class:: classref-reftable-group Властивості ---------------------- .. table:: :widths: auto +-----------------------+----------------------------------------------------------------------------------+--------+ | :ref:`int` | :ref:`max_pending_connections` | ``16`` | +-----------------------+----------------------------------------------------------------------------------+--------+ .. rst-class:: classref-reftable-group Методи ------------ .. table:: :widths: auto +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`int` | :ref:`get_local_port`\ (\ ) |const| | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_connection_available`\ (\ ) |const| | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`bool` | :ref:`is_listening`\ (\ ) |const| | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`listen`\ (\ port\: :ref:`int`, bind_address\: :ref:`String` = "*"\ ) | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`Error` | :ref:`poll`\ (\ ) | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | |void| | :ref:`stop`\ (\ ) | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ | :ref:`PacketPeerUDP` | :ref:`take_connection`\ (\ ) | +-------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+ .. rst-class:: classref-section-separator ---- .. rst-class:: classref-descriptions-group Описи властивостей ------------------------------------ .. _class_UDPServer_property_max_pending_connections: .. rst-class:: classref-property :ref:`int` **max_pending_connections** = ``16`` :ref:`🔗` .. rst-class:: classref-property-setget - |void| **set_max_pending_connections**\ (\ value\: :ref:`int`\ ) - :ref:`int` **get_max_pending_connections**\ (\ ) Визначте максимальну кількість кінцевих з'єднань, під час ``методичного опитування``, будь-яке нове з'єднання, що перевищує це значення буде автоматично скидати. Налаштування цього значення ``0`` ефективно запобігає будь-якому новому з'єднанню згинання (наприклад, коли всі ваші гравці підключені). .. rst-class:: classref-section-separator ---- .. rst-class:: classref-descriptions-group Описи методів -------------------------- .. _class_UDPServer_method_get_local_port: .. rst-class:: classref-method :ref:`int` **get_local_port**\ (\ ) |const| :ref:`🔗` Повертає локальний порт на цей сервер. .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_is_connection_available: .. rst-class:: classref-method :ref:`bool` **is_connection_available**\ (\ ) |const| :ref:`🔗` Повертаємо ``true``, якщо було отримано пакет з новою адресною/портовою комбінацією. .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_is_listening: .. rst-class:: classref-method :ref:`bool` **is_listening**\ (\ ) |const| :ref:`🔗` Повертає ``true``, якщо розетка відкрита і слухає на порт. .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_listen: .. rst-class:: classref-method :ref:`Error` **listen**\ (\ port\: :ref:`int`, bind_address\: :ref:`String` = "*"\ ) :ref:`🔗` Почати сервер, відкривши розетку UDP, прослуховуючи на даній ``port``. Ви можете додатково вказати ``bind_address`` для лише прослуховування пакетів, відправлених на цю адресу. Дивитися також :ref:`PacketPeerUDP.bind()`. .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_poll: .. rst-class:: classref-method :ref:`Error` **poll**\ (\ ) :ref:`🔗` Викликайте цей метод через регулярні проміжки часу (наприклад, всередині :ref:`Node._process()`) для обробки нових пакетів. Будь-який пакет з відомої пари адреса/порт буде доставлено до відповідного :ref:`PacketPeerUDP`, тоді як будь-який пакет, отриманий з невідомої пари адреса/порт, буде додано як очікуване з'єднання (див. :ref:`is_connection_available()` та :ref:`take_connection()`). Максимальна кількість очікуваних з'єднань визначається за допомогою :ref:`max_pending_connections`. .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_stop: .. rst-class:: classref-method |void| **stop**\ (\ ) :ref:`🔗` Зупиняє сервер, закриваючи UDP-сокет, якщо він відкритий. Закриє всі підключені :ref:`PacketPeerUDP`, прийняті через :ref:`take_connection()` (віддалені вузли не будуть повідомлені). .. rst-class:: classref-item-separator ---- .. _class_UDPServer_method_take_connection: .. rst-class:: classref-method :ref:`PacketPeerUDP` **take_connection**\ (\ ) :ref:`🔗` Повертаємо перше з'єднання з попереднім записом (включається до відповідної адреси/порту). Поверніть ``null``, якщо немає нового підключення. ``method_connection_1``, :ref:`PacketPeerUDP.connect_to_host()`. .. |virtual| replace:: :abbr:`virtual (Зазвичай, цей метод перевизначається користувачем, щоб він мав вплив.)` .. |required| replace:: :abbr:`required (This method is required to be overridden when extending its base class.)` .. |const| replace:: :abbr:`const (Цей метод не має побічних ефектів. Не змінює ніяку змінну екземпляра об'єкта.)` .. |vararg| replace:: :abbr:`vararg (Цей метод приймає будь-яке число аргументів після описаних тут.)` .. |constructor| replace:: :abbr:`constructor (Цей метод використовується для побудови типів.)` .. |static| replace:: :abbr:`static (Цей метод не потребує екземпляра для виклику, його можна викликати безпосередньо за допомогою назви класу.)` .. |operator| replace:: :abbr:`operator (Цей метод описує дійсний оператор для взаємодії з цим типом як з лівим операндом.)` .. |bitfield| replace:: :abbr:`BitField (Це значення є цілим числом, складеним у вигляді бітової маски з наступних прапорів.)` .. |void| replace:: :abbr:`void (Значення не повертається.)`