LargeScreen/common/websocket.gd

133 lines
4.1 KiB
GDScript3
Raw Permalink Normal View History

2025-01-02 02:25:42 +08:00
extends Node
class_name WebSocketClient # WebSocket客户端类
# 导出属性
@export var handshake_headers: PackedStringArray # 握手头部信息
@export var supported_protocols: PackedStringArray # 支持的协议列表
var tls_options: TLSOptions = null # TLS选项用于加密通信
# WebSocket连接实例和上一个状态
var socket = WebSocketPeer.new()
var last_state = WebSocketPeer.STATE_CLOSED
# 默认URL
#var default_url = "ws://192.168.4.88:9091"#本地
var default_url = "ws://100.86.230.57:9090"#工作站
#var default_url = "ws://100.118.150.125:9090"#真机
# 信号
signal connected_to_server() # 连接成功信号
signal connection_closed() # 连接关闭信号
signal message_received(message: Variant) # 收到消息信号
signal ret_msg(data)
func _ready():
link()
pass
func link():
# 默认连接到 default_url
socket.connect_to_url(default_url)
# 连接信号到处理函数
socket.connect("message_received", Callable(self, "_on_message_received"))
socket.connect("connected_to_server", Callable(self, "_on_connected_to_server"))
socket.connect("connection_closed", Callable(self, "_on_closed"))
socket.outbound_buffer_size = 655350000
socket.max_queued_packets = 20480000
socket.inbound_buffer_size = 655350000
set_process(true)
# 连接到指定的WebSocket URL
func connect_to_url(url) -> int:
socket.supported_protocols = supported_protocols
socket.handshake_headers = handshake_headers
var err = socket.connect_to_url(url, tls_options)
if err != OK:
return err
return OK
# 发送消息
func send_msg(message) -> int:
if typeof(message) == TYPE_STRING:
#print("Sending text message:", message) # 打印要发送的文本消息
return socket.send_text(message) # 如果消息是字符串,发送文本消息
else:
var message_bytes = var_to_bytes(message) # 将消息转换为字节
#print("Sending binary message:", str(message)) # 打印要发送的二进制消息
return socket.send(message_bytes) # 否则发送二进制消息
# 获取消息并打印到终端
func get_msg() -> Variant:
if socket.get_available_packet_count() < 1:
return null # 如果没有可用消息,返回null
var pkt = socket.get_packet() # 获取消息包
if socket.was_string_packet():
var message = pkt.get_string_from_utf8() # 如果是字符串消息转换为UTF-8字符串
#print("Received message: ", message) # 打印收到的消息到终端
return message
else:
var message = bytes_to_var(pkt) # 转换为变量
#print("Received binary message") # 打印收到的二进制消息到终端
return message
# 关闭连接
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()
# 获取WebSocket连接实例
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:
print("已连接到主机.")
emit_signal("connected_to_server")
elif state == socket.STATE_CLOSED:
print("已断开与主机的连接.")
emit_signal("connection_closed")
elif state == socket.STATE_CONNECTING:
print("正在连接到主机.")
elif state == socket.STATE_CLOSING:
print("使用套接字流关闭.")
while socket.get_ready_state() == socket.STATE_OPEN and socket.get_available_packet_count() > 0:
var msg_data = get_msg()
#ret_msg.emit(msg_data)
emit_signal("message_received",str_to_var(msg_data))
# 每帧调用poll()函数
func _process(delta):
poll()
# 处理接收到的消息
func _on_message_received(message: Variant):
print("WebSocket message received: %s" % str(message))
# 处理连接成功
func _on_connected_to_server():
print("Connected to WebSocket server")
# 处理连接关闭
func _on_closed():
print("WebSocket connection closed")
set_process(false) # 停止处理