GO和Rust分別編寫一個TCP server

Go關於網路的介面的定義是我目前看到抽象的最好的一門語言,只要實現某個介面就可以互相替換。下面是一個GO 版本的TCP server的簡單實現,將客戶端請求的內容直接返回給客戶端。是不是非常的簡單

func main() { lfd, err := net。Listen(“tcp”, “:8080”) if err != nil { panic(err) } for { conn, err := lfd。Accept() if err != nil { fmt。Printf(“accept err。 %v\n”, err) } go handleConn(conn) }}func handleConn(conn net。Conn) { defer conn。Close() io。Copy(conn, conn)}

如何換成Rust實現同步版本如下:

fn main() { let listener = TcpListener::bind(“127。0。0。1:8080”)。unwrap(); loop { let (stream, _) = listener。accept()。unwrap(); std::thread::spawn(|| { handle_connection(stream); }); }}fn handle_connection(mut stream: TcpStream) { let mut writer = stream。try_clone()。unwrap(); std::io::copy(&mut stream, &mut writer)。unwrap();}

Rust tokio非同步的方式如下:

fn main() { let rt = tokio::runtime::Builder::new_multi_thread() 。enable_all() 。worker_threads(4) 。build() 。unwrap(); rt。block_on(async { let listener = tokio::net::TcpListener::bind(“127。0。0。1:8080”)。await。unwrap(); loop { let (mut socket, _) = listener。accept()。await。unwrap(); tokio::spawn(async move { let (mut reader, mut writer) = socket。into_split(); tokio::io::copy(&mut reader, &mut writer)。await。unwrap(); }); } });}