From bf7b9275c116b5383c4abd88ac35b31a21598f17 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Thu, 11 Feb 2021 00:27:09 +0800 Subject: [PATCH] feat: add message-io --- __network/message_io/Cargo.lock | 456 +++++++++++++++++++++++++++++ __network/message_io/Cargo.toml | 12 + __network/message_io/src/client.rs | 46 +++ __network/message_io/src/common.rs | 6 + __network/message_io/src/main.rs | 17 ++ __network/message_io/src/server.rs | 69 +++++ 6 files changed, 606 insertions(+) create mode 100644 __network/message_io/Cargo.lock create mode 100644 __network/message_io/Cargo.toml create mode 100644 __network/message_io/src/client.rs create mode 100644 __network/message_io/src/common.rs create mode 100644 __network/message_io/src/main.rs create mode 100644 __network/message_io/src/server.rs diff --git a/__network/message_io/Cargo.lock b/__network/message_io/Cargo.lock new file mode 100644 index 0000000..738b21f --- /dev/null +++ b/__network/message_io/Cargo.lock @@ -0,0 +1,456 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bincode" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +dependencies = [ + "byteorder", + "serde", +] + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "byteorder" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const_fn" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" + +[[package]] +name = "crossbeam" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd01a6eb3daaafa260f6fc94c3a6c36390abc2080e38e3e34ced87393fb77d80" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +dependencies = [ + "cfg-if 1.0.0", + "const_fn", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f6cb3c7f5b8e51bc3ebb73a2327ad4abdbd119dc13223f14f961d2f38486756" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +dependencies = [ + "autocfg", + "cfg-if 1.0.0", + "lazy_static", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "memoffset" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +dependencies = [ + "autocfg", +] + +[[package]] +name = "message-io" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "783d34ca73b20da30e8eaa5cc3339d1df825e69671251a79510506bdb8ac87e4" +dependencies = [ + "bincode", + "crossbeam", + "lazy_static", + "log", + "mio", + "net2", + "num_enum", + "serde", +] + +[[package]] +name = "message_io" +version = "0.1.0" +dependencies = [ + "message-io", + "rust_util", + "serde", +] + +[[package]] +name = "mio" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e50ae3f04d169fcc9bde0b547d1c205219b7157e07ded9c5aff03e0637cb3ed7" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +dependencies = [ + "socket2", + "winapi", +] + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_enum" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b45a5c2ac4dd696ed30fa6b94b057ad909c7b7fc2e0d0808192bced894066" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom", + "redox_syscall", +] + +[[package]] +name = "rust_util" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f080ed911fa2d4b15146089c1c16497bb9831eb09858c931f0cd720475813" +dependencies = [ + "lazy_static", + "libc", + "term", + "term_size", +] + +[[package]] +name = "rustversion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "serde" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.123" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "term_size" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/__network/message_io/Cargo.toml b/__network/message_io/Cargo.toml new file mode 100644 index 0000000..b13643f --- /dev/null +++ b/__network/message_io/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "message_io" +version = "0.1.0" +authors = ["Hatter Jiang "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +message-io = "0.6" +serde = { version = "1.0", features = ["derive"] } +rust_util = "0.6" diff --git a/__network/message_io/src/client.rs b/__network/message_io/src/client.rs new file mode 100644 index 0000000..cbefb90 --- /dev/null +++ b/__network/message_io/src/client.rs @@ -0,0 +1,46 @@ +use super::common::{Message}; + +use message_io::events::{EventQueue}; +use message_io::network::{Network, NetEvent, Transport}; + +use std::time::{Duration}; + +enum Event { + Network(NetEvent), + Greet, +} + +pub fn run(name: &str) { + let mut event_queue = EventQueue::new(); + + let network_sender = event_queue.sender().clone(); + let mut network = Network::new(move |net_event| network_sender.send(Event::Network(net_event))); + + let server_addr = "127.0.0.1:3000"; + if let Ok(server_id) = network.connect(Transport::Tcp, server_addr) { + success!("Connect to server by TCP at {}", server_addr); + event_queue.sender().send(Event::Greet); + + loop { + match event_queue.receive() { + Event::Greet => { + network.send(server_id, Message::Greetings(format!("Hi, I am {}", name))); + event_queue.sender().send_with_timer(Event::Greet, Duration::from_secs(1)); + } + Event::Network(net_event) => match net_event { + NetEvent::Message(_, message) => match message { + Message::Greetings(text) => information!("Server says: {}", text), + }, + NetEvent::AddedEndpoint(_) => unreachable!(), + NetEvent::RemovedEndpoint(_) => { + information!("Server is disconnected"); + return + } + NetEvent::DeserializationError(_) => (), + }, + } + } + } else { + failure!("Can not connect to the server by TCP to {}", server_addr); + } +} diff --git a/__network/message_io/src/common.rs b/__network/message_io/src/common.rs new file mode 100644 index 0000000..52a95fc --- /dev/null +++ b/__network/message_io/src/common.rs @@ -0,0 +1,6 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Serialize, Deserialize)] +pub enum Message { + Greetings(String), +} diff --git a/__network/message_io/src/main.rs b/__network/message_io/src/main.rs new file mode 100644 index 0000000..22189ff --- /dev/null +++ b/__network/message_io/src/main.rs @@ -0,0 +1,17 @@ +#[macro_use] extern crate rust_util; + +mod common; +mod client; +mod server; + +pub fn main() { + let args: Vec = std::env::args().collect(); + match args.get(1).unwrap_or(&String::new()).as_ref() { + "client" => match args.get(2) { + Some(name) => client::run(name), + None => failure!("The client needs a 'name'"), + }, + "server" => server::run(), + _ => information!("Usage: basic client | server"), + } +} \ No newline at end of file diff --git a/__network/message_io/src/server.rs b/__network/message_io/src/server.rs new file mode 100644 index 0000000..5aee56b --- /dev/null +++ b/__network/message_io/src/server.rs @@ -0,0 +1,69 @@ +use super::common::{Message}; + +use message_io::events::{EventQueue}; +use message_io::network::{Network, NetEvent, Endpoint, Transport}; + +use std::collections::{HashMap}; + +struct ClientInfo { + count: usize, +} + +enum Event { + Network(NetEvent), +} + +pub fn run() { + let mut event_queue = EventQueue::new(); + + let network_sender = event_queue.sender().clone(); + let mut network = Network::new(move |net_event| { + network_sender.send(Event::Network(net_event)) + }); + + let mut clients: HashMap = HashMap::new(); + + let listen_addr = "127.0.0.1:3000"; + match network.listen(Transport::Tcp, listen_addr) { + Ok(_) => success!("TCP Server running at {}", listen_addr), + Err(_) => return failure!("Can not listening at {}", listen_addr), + } + + loop { + match event_queue.receive() { + Event::Network(net_event) => match net_event { + NetEvent::Message(endpoint, message) => match message { + Message::Greetings(text) => { + let mut client_info = clients.get_mut(&endpoint).unwrap(); + client_info.count += 1; + information!( + "Client ({}) says '{}' {} times", + endpoint.addr(), + text, + client_info.count + ); + let msg = format!("Hi, I hear you for {} time", client_info.count); + network.send(endpoint, Message::Greetings(msg)); + } + }, + NetEvent::AddedEndpoint(endpoint) => { + clients.insert(endpoint, ClientInfo { count: 0 }); + information!( + "Client ({}) connected (total clients: {})", + endpoint.addr(), + clients.len() + ); + } + NetEvent::RemovedEndpoint(endpoint) => { + clients.remove(&endpoint).unwrap(); + information!( + "Client ({}) disconnected (total clients: {})", + endpoint.addr(), + clients.len() + ); + } + NetEvent::DeserializationError(_) => (), + }, + } + } +} \ No newline at end of file