summaryrefslogtreecommitdiff
path: root/addons/gdUnit4/src/network/GdUnitTcpClient.gd
diff options
context:
space:
mode:
authorradiohotline <radoihotline@disroot.rg>2026-08-25 16:33:56 +0300
committerradiohotline <radoihotline@disroot.rg>2026-08-25 16:33:56 +0300
commita89e744ed0e8c759caf041a580112365bbfe4303 (patch)
treedd61e320904176995727e86a857d00c90d4933ba /addons/gdUnit4/src/network/GdUnitTcpClient.gd
parent6d53d8cac78250dc888aa49d5f9d4175c6652feb (diff)
escoria updateHEADmain
Diffstat (limited to 'addons/gdUnit4/src/network/GdUnitTcpClient.gd')
-rw-r--r--addons/gdUnit4/src/network/GdUnitTcpClient.gd126
1 files changed, 126 insertions, 0 deletions
diff --git a/addons/gdUnit4/src/network/GdUnitTcpClient.gd b/addons/gdUnit4/src/network/GdUnitTcpClient.gd
new file mode 100644
index 0000000..d6c8a42
--- /dev/null
+++ b/addons/gdUnit4/src/network/GdUnitTcpClient.gd
@@ -0,0 +1,126 @@
+@tool
+class_name GdUnitTcpClient
+extends GdUnitTcpNode
+
+signal connection_succeeded(message: String)
+signal connection_failed(message: String)
+
+
+var _client_name: String
+var _debug := false
+var _host: String
+var _port: int
+var _client_id: int
+var _connected: bool
+var _stream: StreamPeerTCP
+
+
+func _init(client_name := "GdUnit4 TCP Client", debug := false) -> void:
+ _client_name = client_name
+ _debug = debug
+
+
+func _ready() -> void:
+ _connected = false
+ _stream = StreamPeerTCP.new()
+ #_stream.set_big_endian(true)
+
+
+func stop() -> void:
+ console("Disconnecting from server")
+ if _stream != null:
+ rpc_send(_stream, RPCClientDisconnect.new().with_id(_client_id))
+ if _stream != null:
+ _stream.disconnect_from_host()
+ _connected = false
+
+
+func start(host: String, port: int) -> GdUnitResult:
+ _host = host
+ _port = port
+ if _connected:
+ return GdUnitResult.warn("Client already connected ... %s:%d" % [_host, _port])
+
+ # Connect client to server
+ if _stream.get_status() != StreamPeerTCP.STATUS_CONNECTED:
+ var err := _stream.connect_to_host(host, port)
+ #prints("connect_to_host", host, port, err)
+ if err != OK:
+ return GdUnitResult.error("GdUnit4: Can't establish client, error code: %s" % err)
+ return GdUnitResult.success("GdUnit4: Client connected checked port %d" % port)
+
+
+func _process(_delta: float) -> void:
+ match _stream.get_status():
+ StreamPeerTCP.STATUS_NONE:
+ return
+
+ StreamPeerTCP.STATUS_CONNECTING:
+ set_process(false)
+ # wait until client is connected to server
+ for retry in 10:
+ @warning_ignore("return_value_discarded")
+ _stream.poll()
+ console("Waiting to connect ..")
+ if _stream.get_status() == StreamPeerTCP.STATUS_CONNECTING:
+ await get_tree().create_timer(0.500).timeout
+ if _stream.get_status() == StreamPeerTCP.STATUS_CONNECTED:
+ set_process(true)
+ return
+ set_process(true)
+ _stream.disconnect_from_host()
+ console("Connection failed")
+ connection_failed.emit("Connect to TCP Server %s:%d faild!" % [_host, _port])
+
+ StreamPeerTCP.STATUS_CONNECTED:
+ if not _connected:
+ var rpc_data :RPC = null
+ set_process(false)
+ while rpc_data == null:
+ await get_tree().create_timer(0.500).timeout
+ rpc_data = rpc_receive()
+ set_process(true)
+ _client_id = (rpc_data as RPCClientConnect).client_id()
+ console("Connected to Server: %d" % _client_id)
+ connection_succeeded.emit("Connect to TCP Server %s:%d success." % [_host, _port])
+ _connected = true
+ process_rpc()
+
+ StreamPeerTCP.STATUS_ERROR:
+ console("Connection failed")
+ _stream.disconnect_from_host()
+ connection_failed.emit("Connect to TCP Server %s:%d faild!" % [_host, _port])
+ return
+
+
+func is_client_connected() -> bool:
+ return _connected
+
+
+func process_rpc() -> void:
+ if _stream.get_available_bytes() > 0:
+ var rpc_data := rpc_receive()
+ if rpc_data is RPCClientDisconnect:
+ console("RPCClientDisconnect")
+ GdUnitSignals.instance().gdunit_test_session_terminate.emit.call_deferred()
+
+
+func send(data: RPC) -> void:
+ rpc_send(_stream, data)
+
+
+func rpc_receive() -> RPC:
+ return receive_packages(_stream).front()
+
+
+func console(value: Variant) -> void:
+ if _debug:
+ print(_client_name, ": ", value)
+
+
+func _on_connection_failed(message: String) -> void:
+ console("Connection faild by: " + message)
+
+
+func _on_connection_succeeded(message: String) -> void:
+ console("Connected: " + message)