UDPServer
Hereda: RefCounted < Object
Clase de ayudante para implementar un servidor UDP.
Descripción
A simple server that opens a UDP socket and returns connected PacketPeerUDP upon receiving new packets. See also PacketPeerUDP.connect_to_host().
After starting the server (listen()), you will need to poll() it at regular intervals (e.g. inside Node._process()) for it to process new packets, delivering them to the appropriate PacketPeerUDP, and taking new connections.
Below a small example of how it can be used:
# server_node.gd
class_name ServerNode
extends Node
var server = UDPServer.new()
var peers = []
func _ready():
server.listen(4242)
func _process(delta):
server.poll() # Important!
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()])
# Reply so it knows we received the message.
peer.put_packet(packet)
# Keep a reference so we can keep contacting the remote peer.
peers.append(peer)
for i in range(0, peers.size()):
pass # Do something with the connected peers.
// 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(); // Important!
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()}");
// Reply so it knows we received the message.
peer.PutPacket(packet);
// Keep a reference so we can keep contacting the remote peer.
_peers.Add(peer);
}
foreach (var peer in _peers)
{
// Do something with the 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:
# Try to contact server
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)
{
// Try to contact server
_udp.PutPacket("The Answer Is..42!".ToUtf8Buffer());
}
if (_udp.GetAvailablePacketCount() > 0)
{
GD.Print($"Connected: {_udp.GetPacket().GetStringFromUtf8()}");
_connected = true;
}
}
}
Propiedades
|
Métodos
get_local_port() const |
|
is_connection_available() const |
|
is_listening() const |
|
poll() |
|
void |
stop() |
Descripciones de Propiedades
int max_pending_connections = 16 🔗
Definir el número máximo de conexiones pendientes, durante el poll(), cualquier nueva conexión pendiente que supere ese valor será automáticamente eliminada. Ajustar este valor a 0 impide efectivamente que se acepte cualquier nueva conexión pendiente (por ejemplo, cuando todos tus jugadores se han conectado).
Descripciones de Métodos
Devuelve el puerto local que este servidor está escuchando.
bool is_connection_available() const 🔗
Devuelve true si un paquete con una nueva combinación de dirección/puerto fue recibido en el socket.
Devuelve true si el socket está abierto y escuchando en un puerto.
Error listen(port: int, bind_address: String = "*") 🔗
Inicia el servidor abriendo un socket UDP que escucha en el port dado. Opcionalmente, puedes especificar una bind_address para que solo escuche los paquetes enviados a esa dirección. Véase también PacketPeerUDP.bind().
Llama a este método a intervalos regulares (p. ej., dentro de Node._process()) para procesar nuevos paquetes. Cualquier paquete de un par dirección/puerto conocido se entregará al PacketPeerUDP apropiado, mientras que cualquier paquete recibido de un par dirección/puerto desconocido se añadirá como una conexión pendiente (consulta is_connection_available() y take_connection()). El número máximo de conexiones pendientes se define mediante max_pending_connections.
void stop() 🔗
Detiene el servidor, cerrando el enchufe UDP si está abierto. Cerrará todos los PacketPeerUDP conectados aceptados a través del take_connection() (los compañeros remotos no serán notificados).
PacketPeerUDP take_connection() 🔗
Devuelve la primera conexión pendiente (conectada a la dirección/puerto apropiado). Devolverá null si no hay una nueva conexión disponible. Véase también is_connection_available(), PacketPeerUDP.connect_to_host().