transmit_multiple_structs/
transmit_multiple_structs.rs

1//! A example to show how to transmit multiple structs.
2//!
3//! If you want to transmit multiple structs, you should make your struct derive Serialize and
4//! Deserialize trait and wrap them in an enum.
5//!
6//! You can test this out by running:
7//!
8//!     cargo run --example transmit_multiple_structs server
9//!
10//! And then in another window run:
11//!
12//!     cargo run --example transmit_multiple_structs client
13//!
14
15extern crate msg_transmitter;
16#[macro_use]
17extern crate serde_derive;
18extern crate bincode;
19extern crate tokio;
20
21use msg_transmitter::*;
22
23use std::env;
24
25#[derive(Serialize, Deserialize, Debug, Clone)]
26enum Message {
27    VecOfF32msg(VecOfF32),
28    Endmsg(End),
29}
30
31#[derive(Serialize, Deserialize, Debug, Clone)]
32struct VecOfF32 {
33    vec: Vec<u32>,
34}
35
36#[derive(Serialize, Deserialize, Debug, Clone)]
37struct End;
38
39fn main() {
40    let a = env::args().skip(1).collect::<Vec<_>>();
41    match a.first().unwrap().as_str() {
42        "client" => client(),
43        "server" => server(),
44        _ => panic!("failed"),
45    };
46}
47
48fn server() {
49    let server = create_tcp_server("127.0.0.1:6666", "server");
50    let server_task = server.start_server(Message::VecOfF32msg(VecOfF32 { vec: vec![] }), |client_name: String, msg: Message| {
51        println!("{}: {:?}", client_name, msg);
52        match msg {
53            Message::VecOfF32msg(vec_of_32) => {
54                if vec_of_32.vec.len() < 10 {
55                    vec![(client_name, Message::VecOfF32msg(vec_of_32))]
56                } else {
57                    vec![(client_name, Message::Endmsg(End))]
58                }
59            }
60            Message::Endmsg(_) => {
61                std::process::exit(0)
62            }
63        }
64    });
65    tokio::run(server_task);
66}
67
68fn client() {
69    let client = create_tcp_client("127.0.0.1:6666", "client");
70    // x is used to test whether the closure can change the outer mutable variable
71    let mut x: u32 = 0;
72    let client_task = client.start_client(move |msg: Message| {
73        println!("{:?}", msg);
74        match msg {
75            Message::VecOfF32msg(mut vec_of_32) => {
76                x += 1;
77                vec_of_32.vec.push(1);
78                vec![Message::VecOfF32msg(vec_of_32)]
79            }
80            Message::Endmsg(_) => {
81                println!("Outer count is {:?}", x);
82                std::process::exit(0)
83            }
84        }
85    });
86    tokio::run(client_task);
87}
88