Some checks failed
Create tag and build when new code gets to main / Export (push) Failing after 3m40s
125 lines
3.2 KiB
GDScript
125 lines
3.2 KiB
GDScript
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:
|
|
stop()
|
|
|
|
|
|
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)
|