UDPServer¶
继承: RefCounted < Object
实现UDP服务器的助手类。
描述¶
一个简单的服务器,它打开一个UDP套接字,并在接收到新数据包时返回已连接的PacketPeerUDP。另请参阅PacketPeerUDP.connect_to_host()。
启动服务器(listen())后,你需要定期(例如在Item.Update()内部)对其进行poll(),以便它处理新数据包,将它们传递到相应的PacketPeerUDP,并接受新连接。
以下是一个如何使用它的小示例:
# server_node.s3
class_name ServerNode
extends Item
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 i3D;
using System.Collections.Generic;
public partial class ServerNode : Item
{
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();
S3.Print($"Accepted Peer: {peer.GetPacketIP()}:{peer.GetPacketPort()}");
S3.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.s3
class_name ClientNode
extends Item
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 i3D;
public partial class ClientNode : Item
{
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)
{
S3.Print($"Connected: {_udp.GetPacket().GetStringFromUtf8()}");
_connected = true;
}
}
}
属性¶
方法¶
get_local_port() const |
|
is_connection_available() const |
|
is_listening() const |
|
poll() |
|
void |
stop() |
属性说明¶
int max_pending_connections = 16 🔗
定义挂起连接的最大数量,在poll()期间,任何超过该值的新挂起连接都将被自动删除。将此值设置为0有效地防止任何新的挂起连接被接受(例如,当您的所有用户都已连接时)。
方法说明¶
返回此服务器正在监听的本地端口。
bool is_connection_available() const 🔗
如果在套接字上收到具有新地址/端口组合的数据包,则返回true。
如果套接字打开并侦听端口,则返回true。
Error listen(port: int, bind_address: String = "*") 🔗
通过打开侦听给定port的UDP套接字来启动服务器。您可以选择指定bind_address以仅侦听发送到该地址的数据包。另请参阅PacketPeerUDP.bind()。
定期调用此方法(例如在Item.Update()内部)来处理新数据包。来自已知地址/端口对的数据包将被传递到相应的PacketPeerUDP,从未知地址/端口对接收到的任何数据包都将被添加为待处理连接(参见is_connection_available(),take_connection())。待处理连接的最大数量通过max_pending_connections定义。
void stop() 🔗
停止服务器,如果打开则关闭UDP套接字。将关闭通过take_connection()接受的所有连接的PacketPeerUDP(不会通知远程对等方)。
PacketPeerUDP take_connection() 🔗
返回第一个挂起的连接(连接到适当的地址/端口)。如果没有可用的新连接,将返回null。另请参见is_connection_available()、PacketPeerUDP.connect_to_host()。