std::comm::Chanを利用した簡易メッセージキューサーバもどき

chanをcloneすることで複数クライアントからの入力を共通のPortで待ち受けることができる.

use std::io::BufferedStream;
use std::io::net::ip::{Ipv4Addr, SocketAddr};
use std::io::net::tcp::{TcpStream, TcpListener};
use std::io::{Acceptor, Listener};
use std::comm::{Chan, Port};


fn handle_client(stream: TcpStream, ch: Chan<~str>) {
    let mut stream = BufferedStream::new(stream);
    let buf = match stream.read_line() {
        Ok(buf) => buf,
        Err(err) => fail!("{}", err.to_str())
    };

    ch.send(buf.replace("\r\n", ""));
}


fn main() {
    let addr = SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 8000 };

    let mut acceptor = match TcpListener::bind(addr).listen() {
        Ok(acceptor) => acceptor,
        Err(err) => fail!("{}", err.to_str())
    };

    let (port, chan): (Port<~str>, Chan<~str>) = Chan::new();

    spawn(proc() {
            let mut arr: ~[~str] = ~[];
            loop {
                let msg = port.recv();
                arr.push(msg);
                println!("{}", arr.to_str());
            }
        });

    loop {
        let mut stream = match acceptor.accept() { 
            Ok(stream) => stream,
            Err(err) => fail!("{}", err.to_str())
        };
        let ch = chan.clone();
        spawn(proc() { handle_client(stream, ch); });
    };
}