PacketPeerUDP
繼承: PacketPeer < RefCounted < Object
UDP 資料包使用者端。
說明
UDP packet peer. Can be used to send and receive raw UDP packets as well as Variants.
Example: Send a packet:
var peer = PacketPeerUDP.new()
# Optionally, you can select the local port used to send the packet.
peer.bind(4444)
peer.set_dest_address("1.1.1.1", 4433)
peer.put_packet("hello".to_utf8_buffer())
Example: Listen for packets:
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)
Note: When exporting to Android, make sure to enable the INTERNET permission in the Android export preset before exporting the project or using one-click deploy. Otherwise, network communication of any kind will be blocked by 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) 🔗
Binds this PacketPeerUDP to the specified port and bind_address with a buffer size recv_buf_size, allowing it to receive incoming packets.
If bind_address is set to "*" (default), the peer will be bound on all available addresses (both IPv4 and IPv6).
If bind_address is set to "0.0.0.0" (for IPv4) or "::" (for IPv6), the peer will be bound to all available addresses matching that IP type.
If bind_address is set to any valid address (e.g. "192.168.1.101", "::1", etc.), the peer will only be bound to the interface with that address (or fail if no interface with the given address exists).
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()。
Waits for a packet to arrive on the bound address. See bind().
Note: wait() can't be interrupted once it has been called. This can be worked around by allowing the other party to send a specific "death pill" packet like this:
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;
}
}