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); }); }; }