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...
PacketPeerUDP
Наследует: PacketPeer < RefCounted < Object
Одноранговый UDP-пакет.
Описание
UDP-пакетный узел. Может использоваться для отправки и получения необработанных UDP-пакетов, а также Variant-ы.
Пример: Отправка пакета:
var peer = PacketPeerUDP.new()
# При желании вы можете выбрать локальный порт, используемый для отправки пакета.
peer.bind(4444)
peer.set_dest_address("1.1.1.1", 4433)
peer.put_packet("hello".to_utf8_buffer())
Пример: Прослушивание пакетов:
var peer
func _ready():
peer = PacketPeerUDP.new()
peer.bind(4433)
func _process(_delta):
if peer.get_available_packet_count() > 0:
var array_bytes = peer.get_packet()
var packet_string = array_bytes.get_string_from_ascii()
print("Received message: ", packet_string)
Примечание: При экспорте в Android убедитесь, что в настройках экспорта Android включено разрешение INTERNET перед экспортом проекта или использованием развертывания в один клик. В противном случае сетевое взаимодействие любого рода будет заблокировано Android.
Методы
bind(port: int, bind_address: String = "*", recv_buf_size: int = 65536) |
|
void |
close() |
connect_to_host(host: String, port: int) |
|
get_local_port() const |
|
get_packet_ip() const |
|
get_packet_port() const |
|
is_bound() const |
|
is_socket_connected() const |
|
join_multicast_group(multicast_address: String, interface_name: String) |
|
leave_multicast_group(multicast_address: String, interface_name: String) |
|
void |
set_broadcast_enabled(enabled: bool) |
set_dest_address(host: String, port: int) |
|
wait() |
Описания метода
Error bind(port: int, bind_address: String = "*", recv_buf_size: int = 65536) 🔗
Связывает этот PacketPeerUDP с указанным port и bind_address с размером буфера recv_buf_size, что позволяет ему принимать входящие пакеты.
Если bind_address установлен на "*" (по умолчанию), одноранговый узел будет привязан ко всем доступным адресам (как IPv4, так и IPv6).
Если bind_address установлен на "0.0.0.0" (для IPv4) или "::" (для IPv6), одноранговый узел будет привязан ко всем доступным адресам, соответствующим этому типу IP.
Если bind_address установлен на любой допустимый адрес (например, "192.168.1.101", "::1" и т. д.), одноранговый узел будет привязан только к интерфейсу с этим адресом (или потерпит неудачу, если интерфейс с указанным адресом не существует).
void close() 🔗
Закрывает базовый UDP-сокет PacketPeerUDP.
Error connect_to_host(host: String, port: int) 🔗
Вызов этого метода подключает этот одноранговый узел UDP к заданной паре host/port. UDP на самом деле не требует установления соединения, поэтому эта опция означает только то, что входящие пакеты с разных адресов автоматически отбрасываются, а исходящие пакеты всегда отправляются на подключенный адрес (будущие вызовы set_dest_address() не разрешены). Этот метод не отправляет никаких данных удаленному одноранговому узлу, для этого используйте PacketPeer.put_var() или PacketPeer.put_packet(), как обычно. См. также UDPServer.
Примечание: Подключение к удаленному одноранговому узлу не помогает защититься от вредоносных атак, таких как подмена IP-адреса и т. д. Подумайте об использовании метода шифрования, такого как TLS или DTLS, если вы чувствуете, что ваше приложение передает конфиденциальную информацию.
Возвращает локальный порт, к которому привязан данный одноранговый узел.
String get_packet_ip() const 🔗
Возвращает IP-адрес удаленного узла, отправившего последний пакет (который был получен с помощью PacketPeer.get_packet() или PacketPeer.get_var()).
Возвращает порт удаленного узла, отправившего последний пакет (который был получен с помощью PacketPeer.get_packet() или PacketPeer.get_var()).
Возвращает, привязан ли этот PacketPeerUDP к адресу и может ли он принимать пакеты.
bool is_socket_connected() const 🔗
Возвращает true, если сокет UDP открыт и подключен к удаленному адресу. См. connect_to_host().
Error join_multicast_group(multicast_address: String, interface_name: String) 🔗
Присоединяется к группе многоадресной рассылки, указанной multicast_address, используя интерфейс, идентифицированный interface_name.
Вы можете присоединиться к той же группе многоадресной рассылки с несколькими интерфейсами. Используйте IP.get_local_interfaces(), чтобы узнать, какие из них доступны.
Примечание: Для работы многоадресной рассылки некоторым устройствам Android может потребоваться разрешение CHANGE_WIFI_MULTICAST_STATE.
Error leave_multicast_group(multicast_address: String, interface_name: String) 🔗
Удаляет интерфейс, идентифицированный interface_name, из группы многоадресной рассылки, указанной multicast_address.
void set_broadcast_enabled(enabled: bool) 🔗
Включите или отключите отправку широковещательных пакетов (например, set_dest_address("255.255.255.255", 4343). Эта опция отключена по умолчанию.
Примечание: Для некоторых устройств Android может потребоваться разрешение CHANGE_WIFI_MULTICAST_STATE и включение этой опции для приема широковещательных пакетов.
Error set_dest_address(host: String, port: int) 🔗
Устанавливает адрес назначения и порт для отправки пакетов и переменных. Имя хоста будет разрешено с помощью DNS, если необходимо.
Примечание: set_broadcast_enabled() должен быть включен перед отправкой пакетов на широковещательный адрес (например, 255.255.255.255).
Ожидает прибытия пакета на привязанный адрес. См. bind().
Примечание: wait() не может быть прерван после вызова. Это можно обойти, разрешив другой стороне отправить определенный пакет «пилюли смерти», например:
socket = PacketPeerUDP.new()
# Server
socket.set_dest_address("127.0.0.1", 789)
socket.put_packet("Time to stop".to_ascii_buffer())
# Client
while socket.wait() == OK:
var data = socket.get_packet().get_string_from_ascii()
if data == "Time to stop":
return
var socket = new PacketPeerUdp();
// Server
socket.SetDestAddress("127.0.0.1", 789);
socket.PutPacket("Time to stop".ToAsciiBuffer());
// Client
while (socket.Wait() == OK)
{
string data = socket.GetPacket().GetStringFromASCII();
if (data == "Time to stop")
{
return;
}
}