这次尝试离之前又过去了三个月了,rust已经进入了beta了:
rustc 1.0.0-beta.4 (850151a75 2015-04-30) (built 2015-05-01)
不光是网路部分,整个rust较之前都有了不小的变化。
在第一部分里面(代码在最新的rust是肯定不能用的了),我感受了一下rust的基本网络编程。但什么事情都还没有做。 这个第二部分就是来完成一个echo server.
我还是依据一个rfc来:http://tools.ietf.org/html/rfc862 这里就只实现tcp部分。 直接贴代码了,算是个笔记
use std::net::{TcpListener, TcpStream};
use std::thread;
use std::io::{Read, Write};
// 单个连接的处理函数
fn handle_client(mut stream: TcpStream){
let peer_addr = stream.peer_addr().unwrap();
println!("connected from: {} ", peer_addr);
let mut data = [0; 100];
loop {
let len = stream.read(&mut data).unwrap();
if len == 0{
println!("Peer shutdown!");
break;
}
print!("{} say: ", peer_addr);
for x in 0..len{
print!("{}", data[x] as char);
}
// echo to client
let _ = stream.write(&data[0..len]).unwrap();
}
}
fn main() {
//RFC 说echo server要运行在端口7,这里就运行在7777吧,万恶的unwrap!
let listener = TcpListener::bind("127.0.0.1:7777").unwrap();
for stream in listener.incoming() {
match stream {
Ok(stream) => {
//这里对每一个accept的链接,启动一个线程来处理
//线程函数是个colsure,不带参数
//捕获上下文里面的stream变量,强制move
thread::spawn(move || {
handle_client(stream);
});
}
Err(e) => {
println!("Fucked by the network problem: {} ", e);
}
}
}
}
很多错误没有处理,都直接unwrap了。
下一个试试写一个聊天室程序吧。用一个非常简单需求:
1,服务器启动
2,客户端连接,发送消息到服务器
3,服务器广播消息到所有连接的客户端