use super::common::{FromServerMessage, FromClientMessage};
use message_io::network::{NetEvent, Transport, Endpoint};
use message_io::node::{self};
use std::collections::{HashMap};
use std::net::{SocketAddr};
struct ClientInfo {
count: usize,
}
pub fn run(transport: Transport, addr: SocketAddr) {
let (handler, listener) = node::split::<()>();
let mut clients: HashMap<Endpoint, ClientInfo> = HashMap::new();
match handler.network().listen(transport, addr) {
Ok((_id, real_addr)) => println!("Server running at {} by {}", real_addr, transport),
Err(_) => return println!("Can not listening at {} by {}", addr, transport),
}
listener.for_each(move |event| match event.network() {
NetEvent::Connected(_, _) => (), NetEvent::Accepted(endpoint, _listener_id) => {
clients.insert(endpoint, ClientInfo { count: 0 });
println!("Client ({}) connected (total clients: {})", endpoint.addr(), clients.len());
}
NetEvent::Message(endpoint, input_data) => {
let message: FromClientMessage = bincode::deserialize(&input_data).unwrap();
match message {
FromClientMessage::Ping => {
let message = match clients.get_mut(&endpoint) {
Some(client) => {
client.count += 1;
println!("Ping from {}, {} times", endpoint.addr(), client.count);
FromServerMessage::Pong(client.count)
}
None => {
println!("Ping from {}", endpoint.addr());
FromServerMessage::UnknownPong
}
};
let output_data = bincode::serialize(&message).unwrap();
handler.network().send(endpoint, &output_data);
}
}
}
NetEvent::Disconnected(endpoint) => {
clients.remove(&endpoint).unwrap();
println!(
"Client ({}) disconnected (total clients: {})",
endpoint.addr(),
clients.len()
);
}
});
}