hello_server/
hello_server.rs

1use std::io::{BufRead, BufReader, BufWriter, Write};
2use std::net::{TcpListener, TcpStream};
3use std::thread;
4
5extern crate shared_channel;
6use shared_channel::{shared_channel, SharedReceiver};
7
8fn hello(id: u32, stream: TcpStream) {
9    let reader = BufReader::new(stream.try_clone().unwrap());
10    let mut writer = BufWriter::new(stream);
11
12    // read request
13    for line in reader.lines() {
14        match line {
15            Ok(line) => {
16                if line.len() == 0 {
17                    break;
18                }
19            }
20            _ => {}
21        }
22    }
23    // send response
24    write!(writer, "HTTP/1.1 200 OK\r\n\r\nHello! I'm No.{}", id).unwrap();
25}
26
27fn worker(id: u32, chan: SharedReceiver<TcpStream>) {
28    loop {
29        for steam in chan.iter() {
30            hello(id, steam);
31        }
32    }
33}
34
35fn main() {
36    const N_WORKER: u32 = 4;
37    let (tx, rx) = shared_channel();
38
39    // make thread pool
40    for i in 0..N_WORKER {
41        let rx = rx.clone();
42        thread::spawn(move || worker(i, rx));
43    }
44
45    // run server forever
46    let listener = TcpListener::bind("localhost:5000").expect("failed to listen port 5000");
47    loop {
48        match listener.accept() {
49            Ok((stream, addr)) => {
50                println!("new client: {}", addr);
51                tx.send(stream).unwrap();
52            }
53            Err(e) => println!("accept error: {}", e),
54        }
55    }
56}