Files
godot-demo-projects/networking/websocket_chat/websocket/WebSocketClient.gd
Fabio Alessandrelli dd2ba9a5ba [Net] Update & refactor WebSocket Chat demo.
Uses new unified StreamPeer, dropped the multiplayer part (in favor of
the dedicated WebSocket demo), add reference WebSocketClient and
WebSocketServer signal-based implementations that can be used as drop-in
nodes in any project. Might be worth maintaning it as a separate addon.
2022-09-29 19:16:41 +02:00

74 lines
1.7 KiB
GDScript

extends Node
class_name WebSocketClient
@export var handshake_headers : PackedStringArray
@export var supported_protocols : PackedStringArray
@export var tls_trusted_certificate : X509Certificate
@export var tls_verify := true
var socket = WebSocketPeer.new()
var last_state = WebSocketPeer.STATE_CLOSED
signal connected_to_server()
signal connection_closed()
signal message_received(message: Variant)
func connect_to_url(url) -> int:
socket.supported_protocols = supported_protocols
socket.handshake_headers = handshake_headers
var err = socket.connect_to_url(url, tls_verify, tls_trusted_certificate)
if err != OK:
return err
last_state = socket.get_ready_state()
return OK
func send(message) -> int:
if typeof(message) == TYPE_STRING:
return socket.send_text(message)
return socket.send(var_to_bytes(message))
func get_message() -> Variant:
if socket.get_available_packet_count() < 1:
return null
var pkt = socket.get_packet()
if socket.was_string_packet():
return pkt.get_string_from_utf8()
return bytes_to_var(pkt)
func close(code := 1000, reason := "") -> void:
socket.close(code, reason)
last_state = socket.get_ready_state()
func clear() -> void:
socket = WebSocketPeer.new()
last_state = socket.get_ready_state()
func get_socket() -> WebSocketPeer:
return socket
func poll() -> void:
if socket.get_ready_state() != socket.STATE_CLOSED:
socket.poll()
var state = socket.get_ready_state()
if last_state != state:
last_state = state
if state == socket.STATE_OPEN:
connected_to_server.emit()
elif state == socket.STATE_CLOSED:
connection_closed.emit()
while socket.get_ready_state() == socket.STATE_OPEN and socket.get_available_packet_count():
message_received.emit(get_message())
func _process(delta):
poll()