66 lines
1.6 KiB
GDScript3
Raw Normal View History

2024-01-20 21:18:58 +00:00
extends NetworkNode
2024-01-21 00:21:58 +00:00
## Port number.
2024-01-20 21:18:58 +00:00
@export var port := 4242
2024-01-21 00:21:58 +00:00
## Timeout in milliseconds.
@export var timeout := 5000
## Maximum number of pending connections.
2024-01-20 21:18:58 +00:00
@export var max_pending_connections := 4096
var server := UDPServer.new()
var last_statistics := Time.get_ticks_msec()
2024-01-21 00:21:58 +00:00
var clients := {}
2024-01-20 21:18:58 +00:00
var packet_count := 0
2024-01-21 00:21:58 +00:00
var now := 0
2024-01-20 21:18:58 +00:00
func _init():
super._init()
server.set_max_pending_connections(max_pending_connections)
server.listen(port)
func _process(_delta):
server.poll()
2024-01-21 00:21:58 +00:00
now = Time.get_ticks_msec()
2024-01-20 21:18:58 +00:00
while server.is_connection_available():
var peer: PacketPeerUDP = server.take_connection()
2024-01-21 00:21:58 +00:00
var address := "%s:%d" % [peer.get_packet_ip(), peer.get_packet_port()]
if !clients.has(address):
var connection = Connection.new()
connection.peer = peer
clients[address] = connection
peer_connected(address)
clients[address].last_packet = now
for key in clients:
var client = clients[key]
var peer = client.peer
2024-01-20 21:18:58 +00:00
while peer.get_available_packet_count() > 0:
var packet = peer.get_packet()
handle_packet(packet, peer)
2024-01-21 00:21:58 +00:00
client.last_packet = now
2024-01-20 21:18:58 +00:00
packet_count += 1
2024-01-21 00:21:58 +00:00
if now > last_statistics + 1000:
for address in clients.keys():
var last_packet_time = clients[address].last_packet
if now - last_packet_time > timeout:
peer_disconnected(address)
clients.erase(address)
print("[Server] %d clients | %d packets" % [clients.size(), packet_count])
2024-01-20 21:18:58 +00:00
packet_count = 0
last_statistics = Time.get_ticks_msec()
2024-01-21 00:21:58 +00:00
func peer_connected(_address: String):
pass
func peer_disconnected(address: String):
print("TIMEOUT ", address)