PacketPeerUDP
继承: PacketPeer < RefCounted < Object
UDP 数据包客户端。
描述
UDP 数据包对等体。可以用来发送和接收原始 UPD 数据包和 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("收到消息:", 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() 🔗
关闭该 PacketPeerUDP 底层 UDP 套接字。
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 🔗
返回发送最后一个数据包(通过 PacketPeer.get_packet() 或 PacketPeer.get_var() 接收)的远程对等体的 IP。
返回发送最后一个数据包(通过 PacketPeer.get_packet() 或 PacketPeer.get_var() 接收)的远程对等方的端口。
返回该 PacketPeerUDP 是否被绑定到某个地址上,并且可以接收数据包。
bool is_socket_connected() const 🔗
如果 UDP 套接字已打开并已连接到远程地址,则返回 true。见 connect_to_host()。
Error join_multicast_group(multicast_address: String, interface_name: String) 🔗
使用由 interface_name 标识的接口加入由 multicast_address 指定的多播组。
可以使用多个接口加入同一个多播组。使用 IP.get_local_interfaces() 了解哪些接口可用。
注意:某些 Android 设备可能需要 CHANGE_WIFI_MULTICAST_STATE 权限才能进行多播。
Error leave_multicast_group(multicast_address: String, interface_name: String) 🔗
从 multicast_address 指定的组播组中移除 interface_name 标识的接口。
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 解析主机名。
注意:在向广播地址(例如:255.255.255.255)发送数据包之前,必须启用 set_broadcast_enabled()。
等待数据包到达绑定的地址。见 bind()。
注意:wait() 一旦被调用就无法中断。解决方法是让对方发送一个特定的“毒药”数据包,如下所示:
socket = PacketPeerUDP.new()
# 服务器
socket.set_dest_address("127.0.0.1", 789)
socket.put_packet("Time to stop".to_ascii_buffer())
# 客户端
while socket.wait() == OK:
var data = socket.get_packet().get_string_from_ascii()
if data == "Time to stop":
return
var socket = new PacketPeerUdp();
// 服务器
socket.SetDestAddress("127.0.0.1", 789);
socket.PutPacket("Time to stop".ToAsciiBuffer());
// 客户端
while (socket.Wait() == OK)
{
string data = socket.GetPacket().GetStringFromASCII();
if (data == "Time to stop")
{
return;
}
}