MeteorCat / Godot的WebSocket

Created Sat, 24 Feb 2024 18:12:17 +0800 Modified Wed, 29 Oct 2025 23:24:59 +0800
328 Words

Godot的WebSocket

用于做H5数据转发传输, 这里采用 Godot 内部脚本生成工具类 ( websocket_manager.gd ) :

extends Node

# 会话句柄
var socket:WebSocketPeer = WebSocketPeer.new()

# 确认是否初始化开放过
var _opened:bool = false

# 监听信号事件
signal on_connect
signal on_open
signal on_closing
signal on_closed
signal on_message

# 初始化事件
func _ready():
	stop()
	set_physics_process(false)
	
# 启动执行
func start():
	_opened = false
	set_process(true)
	
# 停止执行
func stop():
	_opened = false
	set_process(false)
	

# 链接WebSocket服务
func connect_to_url(url:String,tls_client_options: TLSOptions = null)->Error:
	# 这里默认采用非安全,正式环境最后配置好安全证书
	if tls_client_options == null:
		tls_client_options = TLSOptions.client_unsafe()
	var state:Error = socket.connect_to_url(url,tls_client_options)
	if state == OK:
		start()
	return state


# 确认是否连接
func is_open()->bool:
	var state:WebSocketPeer.State = socket.get_ready_state()
	return state == WebSocketPeer.STATE_OPEN or state == WebSocketPeer.STATE_CONNECTING


# 监听运行时
func _process(_delta):
	socket.poll()
	var state = socket.get_ready_state()
	
	# 状态分发
	if state == WebSocketPeer.STATE_CONNECTING:
		on_connect.emit(socket)
	elif state == WebSocketPeer.STATE_OPEN:
		if not _opened:
			_opened = true
			on_open.emit(socket)
		while socket.get_available_packet_count():
			on_message.emit(socket,socket.get_packet())
	elif state == WebSocketPeer.STATE_CLOSING:
		on_closing.emit(socket)
	elif state == WebSocketPeer.STATE_CLOSED:
		var code:int = socket.get_close_code()
		var reason:String = socket.get_close_reason()
		on_closed.emit(socket,code,reason)
		stop()


# 推送JSON数据
func send_json(data: Variant, indent: String = "", sort_keys: bool = true, full_precision: bool = false)->Error:
	return socket.send_text(JSON.stringify(data,indent,sort_keys,full_precision))

对于这个访问工具类可以采用全局挂载或者生成全局节点对象挂载, 后续可以直接出扩展出来处理.