rustTcpServer

rust Tcp server

use std::net::{TcpListener,TcpStream};
use std::thread;
use std::io::{Read,Write,Error};
/**
Rust 有一套独特的处理异常情况的机制,它并不像其它语言中的 try 机制那样简单。

首先,程序中一般会出现两种错误:可恢复错误和不可恢复错误。

可恢复错误的典型案例是文件访问错误,如果访问一个文件失败,有可能是因为它正在被占用,是正常的,我们可以通过等待来解决。

但还有一种错误是由编程中无法解决的逻辑错误导致的,例如访问数组末尾以外的位置。

大多数编程语言不区分这两种错误,并用 Exception (异常)类来表示错误。在 Rust 中没有 Exception。

对于可恢复错误用 Result<T, E> 类来处理
move 闭包
**/
//handles a single client
fn handle_client(mut stream:TcpStream)->Result<(),Error>{
    println!("Incomming connection from :{}",stream.peer_addr()?);
    let mut buf=[0;512];
    loop {
        let bytes_read = stream.read(&mut buf)?;
        if bytes_read == 0 { return Ok(()); }
        stream.write(&buf[..bytes_read])?;
    }
}
fn main() {
    let listtener = TcpListener::bind("0.0.0.0:8888").expect("could not bind");
    for stream in listtener.incoming(){
        match stream {
            Err(e)=>{eprintln!("failed:{}",e)}
            Ok(stream)=>{
                thread::spawn(move||{
                    handle_client(stream).unwrap_or_else(|error|eprintln!("{:?}",error));
                });
            }
        }
    }

}