diff options
Diffstat (limited to 'core/src/pad_io')
| -rw-r--r-- | core/src/pad_io/client.rs | 41 | ||||
| -rw-r--r-- | core/src/pad_io/client_debug_cli.rs | 7 | ||||
| -rw-r--r-- | core/src/pad_io/server.rs | 25 | ||||
| -rw-r--r-- | core/src/pad_io/server_debug_cli.rs | 16 |
4 files changed, 43 insertions, 46 deletions
diff --git a/core/src/pad_io/client.rs b/core/src/pad_io/client.rs index 2969742..bd8bc2c 100644 --- a/core/src/pad_io/client.rs +++ b/core/src/pad_io/client.rs @@ -1,4 +1,5 @@ pub mod nogamepads_client { + use std::collections::VecDeque; use crate::pad_data::pad_messages::nogamepads_message_transfer::{read_msg, send_msg}; use crate::pad_data::pad_messages::nogamepads_messages::{ConnectionCallbackMessage, ConnectionErrorType, ConnectionMessage, ControlMessage, GameMessage, LeaveReason}; use crate::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo; @@ -13,15 +14,16 @@ pub mod nogamepads_client { use tokio::io::{AsyncReadExt, AsyncWriteExt, ReadHalf, WriteHalf}; use tokio::net::TcpStream; use tokio::{io, spawn}; - use nogamepads::debug_console::debug_console::read_cli; - use nogamepads::logger::logger_build; + use nogamepads::console_utils::debug_console::read_cli; + use nogamepads::convert_utils::convert_deque_to_vec; + use nogamepads::logger_utils::logger_build; use crate::pad_io::client_debug_cli::{process_debug_cmd, Pcc}; use crate::DEFAULT_PORT; use crate::pad_data::game_profile::game_profile::GameProfile; use crate::pad_data::pad_messages::nogamepads_message_encoder::NgpdMessageEncoder; - type WriteList = Arc<Mutex<Vec<ControlMessage>>>; - type ReadList = Arc<Mutex<Vec<GameMessage>>>; + type WriteList = Arc<Mutex<VecDeque<ControlMessage>>>; + type ReadList = Arc<Mutex<VecDeque<GameMessage>>>; pub struct PadClient { @@ -108,20 +110,16 @@ pub mod nogamepads_client { pub fn put_msg(&self, msg: ControlMessage) { - { - let mut guard = self.write_list.lock().unwrap(); - guard.push(msg); - } + let mut guard = self.write_list.lock().unwrap(); + guard.push_back(msg); } pub fn pop_a_msg(&self) -> Option<GameMessage> { - { - let mut guard = self.read_list.lock().unwrap(); - if ! guard.is_empty() { - Some(guard.remove(0)) - } else { - None - } + let mut guard = self.read_list.lock().unwrap(); + if !guard.is_empty() { + guard.pop_front() + } else { + None } } @@ -132,7 +130,7 @@ pub mod nogamepads_client { pub fn list_received(&self) -> Vec<GameMessage> { match self.read_list.lock() { Ok(guard) => { - guard.to_vec() + convert_deque_to_vec(&guard.to_owned()) } Err(_) => { Vec::new() } } @@ -143,7 +141,7 @@ pub mod nogamepads_client { impl PadClient { pub fn connect(self) { - + self.exit.store(false, SeqCst); // 构建 Logger @@ -238,7 +236,7 @@ pub mod nogamepads_client { } } - async fn check_server_profile (self: &Arc<Self>, buffer: &mut [u8], addr_str: String) -> Option<GameProfile> { + async fn check_server_profile(self: &Arc<Self>, buffer: &mut [u8], addr_str: String) -> Option<GameProfile> { match TcpStream::connect(&addr_str).await { Ok(mut stream) => { send_msg(&mut stream, ConnectionMessage::RequestProfile).await; @@ -363,7 +361,7 @@ pub mod nogamepads_client { } _ => { info!("{:?}", &msg); - guard.push(msg); + guard.push_back(msg); } } } @@ -388,9 +386,10 @@ pub mod nogamepads_client { match lock { Ok(mut guard) => { if ! guard.is_empty() { - msg = Some(guard.remove(0)); + msg = guard.pop_front(); + } else { + msg = None; } - else { msg = None; } } Err(_) => { msg = None; diff --git a/core/src/pad_io/client_debug_cli.rs b/core/src/pad_io/client_debug_cli.rs index c95fb94..b34bef5 100644 --- a/core/src/pad_io/client_debug_cli.rs +++ b/core/src/pad_io/client_debug_cli.rs @@ -2,6 +2,7 @@ use crate::pad_io::client::nogamepads_client::PadClient; use crate::pad_data::pad_messages::nogamepads_messages::{ControlMessage, GameMessage}; use clap::{Args, Parser, Subcommand}; use std::sync::Arc; +use log::info; /// NoGamePads Client - Cli #[derive(Parser, Debug)] @@ -68,15 +69,15 @@ pub fn process_debug_cmd (cmd: Pcc, client: Arc<PadClient>) { Commands::Received(args) => { if args.list { for msg in client.list_received() { - println!("{:?}", msg); + info!("{:?}", msg); } } else { - println!("Total {} messsage(s)!", client.list_received().iter().count()); + info!("Total {} messsage(s)!", client.list_received().iter().count()); } } Commands::Pop(_args) => { - println!("{:?}", client.pop_msg_or(GameMessage::Err)); + info!("{:?}", client.pop_msg_or(GameMessage::Err)); } Commands::Msg(args) => { diff --git a/core/src/pad_io/server.rs b/core/src/pad_io/server.rs index c530753..59241f1 100644 --- a/core/src/pad_io/server.rs +++ b/core/src/pad_io/server.rs @@ -15,8 +15,9 @@ pub mod nogamepads_server { use tokio::net::{TcpListener, TcpStream}; use tokio::{io, spawn}; use tokio::runtime::Runtime; - use nogamepads::debug_console::debug_console::read_cli; - use nogamepads::logger::logger_build; + use nogamepads::console_utils::debug_console::read_cli; + use nogamepads::convert_utils::convert_deque_to_vec; + use nogamepads::logger_utils::logger_build; use crate::DEFAULT_PORT; use crate::pad_data::game_profile::game_profile::GameProfile; use crate::pad_data::pad_messages::nogamepads_messages::ConnectionErrorType::{ContainSamePlayer, GameLocked, PlayerBanned, WhatTheHell}; @@ -219,7 +220,7 @@ pub mod nogamepads_server { match guard.get_key_value(player.account.player_hash.as_str()) { None => { Vec::new() } Some(result) => { - Self::convert_deque_to_vec(result.1) + convert_deque_to_vec(result.1) } } } @@ -301,27 +302,18 @@ pub mod nogamepads_server { Err(err) => Err(err) } } - - fn convert_deque_to_vec (deque: &VecDeque<ControlMessage>) -> Vec<ControlMessage> { - let vec_deque_ref = deque; - let mut vec = Vec::new(); - for item in vec_deque_ref { - vec.push(item.clone()) - } - vec - } } // 服务端状态控制 #[allow(dead_code)] impl PadServer { - pub fn stop_listening(&self) { + pub fn stop_server(&self) { self.put_msg_to_all(&Leave(ServerClosed)); self.stop.store(true, SeqCst); } - pub fn start_listening(self: Arc<Self>) { + pub fn start_server(self: Arc<Self>) { // 构建 Logger if ! self.quiet { @@ -476,6 +468,7 @@ pub mod nogamepads_server { self.set_player_online(&info, true); // 启动控制循环 + spawn(Self::long_connection(Arc::clone(&self), stream, info)); }, _ => { @@ -541,6 +534,7 @@ pub mod nogamepads_server { .entry(player_hash.clone()) .or_insert_with(VecDeque::new) .push_back(msg); + } Err(_) => { } @@ -549,6 +543,7 @@ pub mod nogamepads_server { } Err(e) => { warn!("Error reading from stream: {}", e); + self.set_player_online(&player_info, false); // 放入一条错误信息到队列,使 write_task 及时发现该玩家离开 @@ -594,6 +589,7 @@ pub mod nogamepads_server { let msg = msg.unwrap(); match &writer.write_all(NgpdMessageEncoder::en(&msg).as_slice()).await { Ok(_) => { + info!("Sent {:?} to {}", msg, &player_info.account.id); } Err(error) => { @@ -616,6 +612,7 @@ pub mod nogamepads_server { // 退出程序的监听 if self.stop.load(SeqCst) { tokio::time::sleep(Duration::from_secs(1)).await; + info!("Main thread exited."); exit(0); } diff --git a/core/src/pad_io/server_debug_cli.rs b/core/src/pad_io/server_debug_cli.rs index 76e331f..39e1868 100644 --- a/core/src/pad_io/server_debug_cli.rs +++ b/core/src/pad_io/server_debug_cli.rs @@ -4,6 +4,7 @@ use crate::pad_io::server::nogamepads_server::PadServer; use clap::{Args, Parser, Subcommand}; use std::ops::{Index}; use std::sync::{Arc, MutexGuard, PoisonError}; +use log::{error, info}; use crate::pad_data::pad_player_info::nogamepads_player_info::PlayerInfo; /// NoGamePads Server - Cli @@ -98,7 +99,7 @@ pub fn process_debug_cmd (cmd: Psc, server: Arc<PadServer>) { } Commands::Stop => { - server.stop_listening(); + server.stop_server(); } Commands::List => { @@ -114,21 +115,21 @@ pub fn process_debug_cmd (cmd: Psc, server: Arc<PadServer>) { let player = players.index(args.player.clamp(0, players.iter().count() -1)); if args.list { for msg in server.list_received(player) { - println!("{:?}", msg); + info!("{:?}", msg); } } else { - println!("Total {} messsage(s)!", server.list_received(player).iter().count()); + info!("Total {} messsage(s)!", server.list_received(player).iter().count()); } } Commands::Pop(args) => { match get_player_by_index(&server, args.index) { None => { - eprintln!("Pup message failed : Player index \"{}\" not found!", args.index); + error!("Pup message failed : Player index \"{}\" not found!", args.index); } Some(player) => { let message = server.pop_msg_or(&player, ControlMessage::Err); - println!("{:?}", message); + info!("{:?}", message); } } } @@ -166,7 +167,7 @@ pub fn process_debug_cmd (cmd: Psc, server: Arc<PadServer>) { fn put_to_list(server: Arc<PadServer>, player_index: usize, message: GameMessage) { match get_player_by_index(&server, player_index) { None => { - eprintln!("Put message failed : Player index \"{}\" not found!", player_index); + error!("Put message failed : Player index \"{}\" not found!", player_index); } Some(player) => { server.put_msg_to(message, &player); @@ -197,8 +198,7 @@ fn print_player_list(list: Result<Vec<PlayerInfo>, PoisonError<MutexGuard<HashMa let mut i = 0; for player in list { let n = player.customize.nickname; - print!("({}){} ", i, n); + info!("({}){} ", i, n); i += 1; - println!(); } }
\ No newline at end of file |
