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() 🔗
关闭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) 🔗
使用multicast_address标识的接口加入multicast_address指定的多播组。
您可以使用多个接口加入同一个多播组。使用IP.get_local_interfaces()了解哪些可用。
注意:某些Android设备可能需要CHANGE_WIFI_MULTICAST_STATE权限才能进行多播。
Error leave_multicast_group(multicast_address: String, interface_name: String) 🔗
从interface_name指定的多播组中删除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解析主机名。
注意:set_broadcast_enabled()必须在向播放地址发送数据包之前启用(例如255.255.255.255)。
等待绑定地址上的数据包到达。请参阅bind()。
注意: wait()一旦被调用就无法中断。可以通过让另一方发送特定的"death pill"数据包来解决这个问题:
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;
}
}