aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/client/client.rs4
-rw-r--r--core/src/constants.rs12
-rw-r--r--core/src/lib.rs1
-rw-r--r--core/src/message_encoder.rs46
-rw-r--r--core/src/messages.rs30
-rw-r--r--core/src/player/player_info.rs6
-rw-r--r--core/src/server/server.rs27
-rw-r--r--core/src/test_message_encoder.rs15
-rw-r--r--core/test/src/bin/console_client.rs18
-rw-r--r--core/test/src/bin/console_server.rs9
10 files changed, 123 insertions, 45 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
diff --git a/core/test/src/bin/console_client.rs b/core/test/src/bin/console_client.rs
index 80bf28c..578a5b5 100644
--- a/core/test/src/bin/console_client.rs
+++ b/core/test/src/bin/console_client.rs
@@ -1,11 +1,23 @@
-use there_is_nopads_core::pads_player::{PadClient, PadClientEvent, PlayerInfo};
-use there_is_nopads_core::pads_server::ServerMessage;
+use there_is_nopads_core::client::client::PadClient;
+use there_is_nopads_core::client::client_event::PadClientEvent;
+use there_is_nopads_core::messages::ServerMessage;
+use there_is_nopads_core::player::player_info::PlayerInfo;
fn main() {
+ // 客户端
let client = PadClient::default();
+
+ // 玩家
let mut player = PlayerInfo::default();
+
+ // 设置玩家信息
player.name(String::from("Player"), String::from("catilgrass"));
- println!("{}", player.name_hash);
+
+ // 输出玩家 Hash
+ println!("Hash : {}", player.name_hash);
+
+ // 连接到测试服务器
+ client.connect_server();
}
struct Event;
diff --git a/core/test/src/bin/console_server.rs b/core/test/src/bin/console_server.rs
index 4536c74..26476fa 100644
--- a/core/test/src/bin/console_server.rs
+++ b/core/test/src/bin/console_server.rs
@@ -1,8 +1,13 @@
-use there_is_nopads_core::pads_player::{PlayerInfo, PlayerMessage};
-use there_is_nopads_core::pads_server::{PadServer, PadServerEvent};
+use there_is_nopads_core::messages::PlayerMessage;
+use there_is_nopads_core::player::player_info::PlayerInfo;
+use there_is_nopads_core::server::server::PadServer;
+use there_is_nopads_core::server::server_event::PadServerEvent;
fn main() {
+ // 服务端
let server = PadServer::default();
+
+ // 开始监听
server.start_listening(Event);
}