From b8076fc657d86b41945d3f5a528a9ff6544795f9 Mon Sep 17 00:00:00 2001 From: Weicao-CatilGrass <1992414357@qq.com> Date: Tue, 22 Apr 2025 02:06:55 +0800 Subject: 完善消息编码器 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/message_encoder.rs | 48 +++++++++++++++++++++++++++++++++++++++++---- core/src/messages.rs | 30 +++++++++++++++++++--------- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/core/src/message_encoder.rs b/core/src/message_encoder.rs index e6e10b2..0ef7fc8 100644 --- a/core/src/message_encoder.rs +++ b/core/src/message_encoder.rs @@ -1,7 +1,47 @@ -use crate::messages::PlayerMessage; +use crate::constants::{BINCODE_CONFIG, BINCODE_CONVERT_FAILED}; +use crate::messages::{ClientMessage, PlayerMessage, ServerCallbackMessage, ServerMessage}; +use std::fmt::Debug; +use bincode::{Decode, Encode}; -impl PlayerMessage { - pub fn encode (&self) { - // +pub trait LazyMessageEncoder> { + fn err_result_decode () -> Message; + fn err_result_encode () -> Vec { + BINCODE_CONVERT_FAILED + } + + fn encode (&self) -> Vec where Self : Encode { + bincode::encode_to_vec(self, BINCODE_CONFIG) + .unwrap_or_else(|_| Self::err_result_encode()) + } + + fn decode (encoded : Vec) -> Message { + match bincode::decode_from_slice(&encoded[..], BINCODE_CONFIG) { + Ok((decoded, _)) => decoded, + Err(_) => Self::err_result_decode() + } + } +} + +impl LazyMessageEncoder for PlayerMessage { + fn err_result_decode() -> PlayerMessage { + PlayerMessage::Error + } +} + +impl LazyMessageEncoder for ServerMessage { + fn err_result_decode() -> ServerMessage { + ServerMessage::Error + } +} + +impl LazyMessageEncoder for ClientMessage { + fn err_result_decode() -> ClientMessage { + ClientMessage::Error + } +} + +impl LazyMessageEncoder for ServerCallbackMessage { + fn err_result_decode() -> ServerCallbackMessage { + ServerCallbackMessage::Error } } \ No newline at end of file diff --git a/core/src/messages.rs b/core/src/messages.rs index 2ae8328..b17faeb 100644 --- a/core/src/messages.rs +++ b/core/src/messages.rs @@ -1,10 +1,10 @@ use std::time::Duration; -use serde::{Deserialize, Serialize}; +use bincode::{Decode, Encode}; use crate::player::player_info::PlayerInfo; /// # 玩家消息 /// 玩家 --> 服务器 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum PlayerMessage { /// 消息:发送字符串,服务端无需回复 Message(String), @@ -22,12 +22,15 @@ pub enum PlayerMessage { /// u8:轴向代号 /// f64:X 轴向值 (0 - 1) /// f64:Y 轴向值 (0 - 1) - Axis(u8, (f64, f64)) + Axis(u8, (f64, f64)), + + /// 错误消息 + Error } /// # 服务器消息 /// 服务器 --> 玩家 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ServerMessage { /// 命令:发送字符串,客户端处理 @@ -41,12 +44,15 @@ pub enum ServerMessage { /// 踢出:发送踢出指令,以便让客户端明白自己的掉线是因为被踢出 /// “杀人还要诛心!!!好可怕啊!” - Kick + Kick, + + /// 错误消息 + Error } /// # 客户端消息 /// 客户端 --> 服务器 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ClientMessage { /// 连接请求,将和服务端建立连接,并通知服务器将要建立连接的玩家 @@ -59,12 +65,15 @@ pub enum ClientMessage { RequestSkin, /// 客户端准备就绪 - Ready + Ready, + + /// 错误消息 + Error } /// # 服务器回调消息 /// 服务器 --> 客户端 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub enum ServerCallbackMessage { /// 拒绝:发送消息已通知客户端请求被拒绝 @@ -74,5 +83,8 @@ pub enum ServerCallbackMessage { Accept, /// 欢迎:客户端准备完成后,服务端发送 Welcome 以允许客户端以玩家加入游戏 - Welcome + Welcome, + + /// 错误消息 + Error } \ No newline at end of file -- cgit