diff options
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/client/client.rs | 4 | ||||
| -rw-r--r-- | core/src/constants.rs | 12 | ||||
| -rw-r--r-- | core/src/lib.rs | 1 | ||||
| -rw-r--r-- | core/src/message_encoder.rs | 46 | ||||
| -rw-r--r-- | core/src/messages.rs | 30 | ||||
| -rw-r--r-- | core/src/player/player_info.rs | 6 | ||||
| -rw-r--r-- | core/src/server/server.rs | 27 | ||||
| -rw-r--r-- | core/src/test_message_encoder.rs | 15 |
8 files changed, 101 insertions, 40 deletions
diff --git a/core/src/client/client.rs b/core/src/client/client.rs index c11bb61..e861168 100644 --- a/core/src/client/client.rs +++ b/core/src/client/client.rs @@ -1,4 +1,4 @@ -use crate::constants::DEFAULT_PORT; +use crate::constants::DEFAULT_PORT_UDP; use crate::player::player_info::PlayerInfo; use std::net::SocketAddr; @@ -14,7 +14,7 @@ impl Default for PadClient { fn default() -> Self { PadClient { player_info: PlayerInfo::default(), - remote_addr: SocketAddr::from(([127, 0, 0, 1], DEFAULT_PORT)), + remote_addr: SocketAddr::from(([127, 0, 0, 1], DEFAULT_PORT_UDP)), receive_skin_package: true } } diff --git a/core/src/constants.rs b/core/src/constants.rs index 6257c9d..ef5a3d6 100644 --- a/core/src/constants.rs +++ b/core/src/constants.rs @@ -1,8 +1,16 @@ use bincode::config; use bincode::config::Configuration; +// 默认 Hash 加盐 pub const SALT : &str = ":)"; -pub const DEFAULT_PORT : u16 = 8916; +// 服务器默认端口 +pub const DEFAULT_PORT_UDP: u16 = 8916; +pub const DEFAULT_PORT_TCP : u16 = 8916; -pub const BINCODE_CONFIG : Configuration = config::standard();
\ No newline at end of file +// 加密 +// BinCode 2.0 默认配置 +pub const BINCODE_CONFIG : Configuration = config::standard(); + +// 加密失败时的值 +pub const BINCODE_CONVERT_FAILED : Vec<u8> = Vec::new();
\ No newline at end of file diff --git a/core/src/lib.rs b/core/src/lib.rs index d8b1df8..af919ff 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -7,3 +7,4 @@ pub mod messages; // Private mod constants; mod message_encoder; +mod test_message_encoder; diff --git a/core/src/message_encoder.rs b/core/src/message_encoder.rs index cda7382..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<Message: Encode + Decode<()>> { + fn err_result_decode () -> Message; + fn err_result_encode () -> Vec<u8> { + BINCODE_CONVERT_FAILED + } + + fn encode (&self) -> Vec<u8> where Self : Encode { + bincode::encode_to_vec(self, BINCODE_CONFIG) + .unwrap_or_else(|_| Self::err_result_encode()) + } + + fn decode (encoded : Vec<u8>) -> Message { + match bincode::decode_from_slice(&encoded[..], BINCODE_CONFIG) { + Ok((decoded, _)) => decoded, + Err(_) => Self::err_result_decode() + } + } +} + +impl LazyMessageEncoder<PlayerMessage> for PlayerMessage { + fn err_result_decode() -> PlayerMessage { + PlayerMessage::Error + } +} + +impl LazyMessageEncoder<ServerMessage> for ServerMessage { + fn err_result_decode() -> ServerMessage { + ServerMessage::Error + } +} + +impl LazyMessageEncoder<ClientMessage> for ClientMessage { + fn err_result_decode() -> ClientMessage { + ClientMessage::Error + } +} +impl LazyMessageEncoder<ServerCallbackMessage> 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 diff --git a/core/src/player/player_info.rs b/core/src/player/player_info.rs index 6412b66..3c02889 100644 --- a/core/src/player/player_info.rs +++ b/core/src/player/player_info.rs @@ -1,10 +1,10 @@ +use crate::constants::SALT; +use bincode::{Decode, Encode}; use hex::encode; -use serde::{Deserialize, Serialize}; use sha1::{Digest, Sha1}; -use crate::constants::SALT; /// 玩家信息 -#[derive(Serialize, Deserialize, PartialEq)] +#[derive(Encode, Decode, PartialEq, Debug)] pub struct PlayerInfo { pub display_name: String, pub name_hash: String, diff --git a/core/src/server/server.rs b/core/src/server/server.rs index c71892c..7f0eec3 100644 --- a/core/src/server/server.rs +++ b/core/src/server/server.rs @@ -1,4 +1,4 @@ -use crate::constants::DEFAULT_PORT; +use crate::constants::{DEFAULT_PORT_TCP, DEFAULT_PORT_UDP}; use crate::server::server_event::PadServerEvent; use std::net::{SocketAddr, UdpSocket}; @@ -6,7 +6,8 @@ use std::net::{SocketAddr, UdpSocket}; /// 监听服务器用于连接玩家设备,并接收玩家的按键输入 pub struct PadServer { server_name: String, - port: u16 + port_request_server: u16, + port_io_server: u16 } impl Default for PadServer { @@ -16,7 +17,8 @@ impl Default for PadServer { fn default() -> Self { PadServer { server_name: String::from("This Is No Pads"), - port: DEFAULT_PORT + port_io_server: DEFAULT_PORT_UDP, + port_request_server: DEFAULT_PORT_TCP, // TODO :: 补充布局文件 } } @@ -28,24 +30,7 @@ impl PadServer { /// self : 服务器 /// event : 事件 pub fn start_listening(&self, event : impl PadServerEvent) { - let socket_addr = SocketAddr::from(([127, 0, 0, 1], self.port)); - match UdpSocket::bind(socket_addr) { - Ok(socket) => { - let mut buf = vec![0u8; 1024]; - - loop { - // 接收连接请求 - match socket.recv_from(&mut buf) { - Ok((size, src)) => { - - } - Err(_) => {} - } - } - } - - Err(_) => {} - } + } /// # 停止监听服务器 diff --git a/core/src/test_message_encoder.rs b/core/src/test_message_encoder.rs new file mode 100644 index 0000000..a4d118c --- /dev/null +++ b/core/src/test_message_encoder.rs @@ -0,0 +1,15 @@ +#[cfg(test)] +mod test { + use crate::message_encoder::LazyMessageEncoder; + use crate::messages::PlayerMessage; + + #[test] + fn test_message_encoder() { + let player_message = PlayerMessage::Message(String::from("Hello, World!")); + let player_message_encoded = player_message.encode(); + let player_message_decoded = PlayerMessage::decode(player_message_encoded.clone()); + + assert_eq!(player_message, player_message_decoded); + println!("Done"); + } +}
\ No newline at end of file |
