我正在尝试在 Godot 中编写一个简单的回合制游戏,该游戏依赖于 Python websocket 服务器来进行规则和状态更新。为此,我正在尝试制作一个简单的原型,我可以在其中将文本输入到 Godot 客户端,将其发送到 websocket,并接收一些返回的数据 - 一个“echo”配置。
我已经概述了服务器代码:
# server.py
import socket
HOST = "127.0.0.1"
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
我可以用 Python 编写一个客户端来发送数据并接收回波,但我在 Godot 中做同样的事情充其量是缓慢的。客户端的最小 GDScript 文件可能是什么样子?我应该在哪里寻找有关此类事情的教程?
我查看了 Godot 官方文档来寻找答案,然后查看了在线教程。也许这只是我的搜索引擎的问题,但我还没有找到任何可以立即解决我的问题并用基本术语解释它的东西。
在 Godot 4.2 WebSocketClient 中似乎不再存在,但在编辑器中我找到了带有示例的类 WebSocketPeer。我扩展了该示例以展示如何向套接字服务器发送消息。
extends Node
# The URL we will connect to
@export var websocket_url = "ws://localhost:8080"
# Our WebSocketClient instance
var socket = WebSocketPeer.new()
func _ready():
var err = socket.connect_to_url(websocket_url)
if err != OK:
print("Unable to connect")
set_process(false)
else:
print("connected")
func _process(delta):
socket.poll()
var state = socket.get_ready_state()
if state == WebSocketPeer.STATE_OPEN:
while socket.get_available_packet_count():
_on_message_received(socket.get_packet())
elif state == WebSocketPeer.STATE_CLOSING:
# Keep polling to achieve proper close.
pass
elif state == WebSocketPeer.STATE_CLOSED:
var code = socket.get_close_code()
var reason = socket.get_close_reason()
_on_closed(code, reason)
func _on_message_received(packet: PackedByteArray):
var message = packet.get_string_from_utf8()
print("WebSocket message received: %s" % message)
func _on_closed(code, reason):
print("WebSocket closed with code: %d, reason %s. Clean: %s" % [code, reason, code != -1])
set_process(false) # Stop processing.
func _send_message(message : String):
var state = socket.get_ready_state()
if state == WebSocketPeer.STATE_OPEN:
socket.send_text(message)
基本上它与 WebSocketClient 类似,但没有信号。在此过程中,您轮询套接字并检查当前状态。如果它打开,您将获得可用的数据包。
发送也一样。如果您直接想发送字符串,可以使用 send_text 函数,如示例中所示。要发送字节数组,您可以使用 send。