LargeScreen/common/websocket.gd
2025-01-02 02:25:42 +08:00

133 lines
4.1 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) # 停止处理