The real challenge for our server comes with a specially constructed client. Let's go through it before we see the client in action. The preamble is typical:
#[macro_use] extern crate slog; extern crate clap; extern crate slog_async; extern crate slog_term; use clap::{App, Arg}; use slog::Drain; use std::net::TcpStream; use std::sync::atomic::{AtomicUsize, Ordering}; use std::{thread, time}; static TOTAL_STREAMS: AtomicUsize = AtomicUsize::new(0);
In fact, this client preamble hews fairly close to that of the server. So, too, the main function, as we'll see shortly. As with many other programs in this book, we dedicate a thread to reporting on the behavior of the program. In this client, this thread runs the long-lived report