使用 TCP 在 GDScript 和 Rust 之间发送对象
我想将我的游戏连接到 Rust 服务器并进行基于事件的通信。
rust 方面的枚举看起来有点像这样:
enum Event {
Login(String),
LoadChunk(Chunk),
ChunkUpdate(Chunk),
}
我已经使用 StreamPeerTCP 和 std::net::TcpListener 工作了一个非常简单的客户端和服务器,并且我已经可以发送它们之间的字符串是utf8编码的。
现在我想从服务器向客户端发送一个事件。 为此,我将服务器上的事件序列化为 JSON,然后使用 as_bytes()
将此字符串中的字节发送到客户端。
这是客户端上处理从 StreamPeerTCP 接收到的数据的函数:
func _handle_client_data(data: PoolByteArray) -> void:
var string_data: String = data.get_string_from_utf8();
var parsed_data: Object = JSON.parse(string_data);
但现在由于输入松散,我不知道应该如何访问对象中的任何字段。
我认为我做的事情根本上是错误的,但我不知道有什么更好的解决方案。
谁能帮助我解决这样的问题?
I want to connect my game to a rust server and have an event based communication.
The enum on the rust side looks somewhat like this:
enum Event {
Login(String),
LoadChunk(Chunk),
ChunkUpdate(Chunk),
}
I already got a very simple Client and Server using StreamPeerTCP
and std::net::TcpListener
working and I can already send utf8 encoded strings between them.
Now I want to send an event from the server to the client.
To do so I serialize the event on the server into JSON and then send the bytes from this string to the client using as_bytes()
.
This is the function on the client which processes the data received from StreamPeerTCP
:
func _handle_client_data(data: PoolByteArray) -> void:
var string_data: String = data.get_string_from_utf8();
var parsed_data: Object = JSON.parse(string_data);
But now due to loose typing I do not know how I should access any fields from the object.
I think I am doing something fundamentally wrong but I do not know any better solution.
Can anyone help me on how to approach such a problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我使用 GDNative 将整个 TCP 客户端移至 Rust 和 tokio。
Rust 和 GDscript 语言之间的接口仍然是 JSON。
客户端发出一个
Event
信号,该信号由TcpClientWrapper
在此函数中处理:Rust 中的原始事件:
为了与客户端交互,我在
ClientTcpWrapper 中有此脚本:
I moved the whole TCP-client to rust and tokio using GDNative.
The interface between the rust and GDscript languages is still JSON.
the client emits a
Event
signal which gets handled in this function by theTcpClientWrapper
:The original Event in rust:
To interface With the client I have this script in
ClientTcpWrapper
: