Kanäle
Server-Client-Kommunikation
Abschnitt betitelt „Server-Client-Kommunikation“use std::{sync::mpsc, thread};
enum ClientMessage { Incr, Get, Quit }enum ServerMessage { Get(usize) }
fn main() { let (server_tx, client_rx) = mpsc::channel(); let (client_tx, server_rx) = mpsc::channel(); let server = thread::spawn(move || { let mut n = 0; loop { match server_rx.recv().unwrap() { ClientMessage::Quit => break, ClientMessage::Incr => n += 1, ClientMessage::Get => server_tx.send(ServerMessage::Get(n)).unwrap() } } });
for msg in [ClientMessage::Incr, ClientMessage::Get, ClientMessage::Quit] { client_tx.send(msg).unwrap(); }
if let ServerMessage::Get(n) = client_rx.recv().unwrap() { println!("{}", n) }
server.join().unwrap();}Dies ist ein Beispiel dafür, wie Sie Enums verwenden können, um verschiedene Arten von Nachrichten über einen Kanal zu senden. Hier inkrementiert der Client eine Zahl, ruft die Zahl ab und beendet dann den Server.
Kanäle und Typen
Abschnitt betitelt „Kanäle und Typen“use std::{sync::mpsc, thread};
fn main() { let (tx, rx) = mpsc::channel(); thread::spawn(move || { let s = String::from("Hello world"); tx.send(s.clone()).unwrap(); tx.send(s.len()).unwrap(); }); let s = rx.recv().unwrap(); let n = rx.recv().unwrap(); println!("{s} {n}");}Kanäle können nur Werte eines einzigen Typs senden, daher ist tx.send(s.len()) ein Typfehler. Wenn Sie Werte verschiedener Typen senden möchten, können Sie entweder ein Enum oder das Any-Trait verwenden.