Chr*_*gan 47
这是一个非常简单的例子std::net.它是针对当前的Rust大师开发的,并且应该在1.*上工作.
小心这个例子; 它被简化了; 如果绑定,倾听或接受产生错误,您可能不希望它发生恐慌.
use std::io::Write;
use std::net::TcpListener;
use std::thread;
fn main() {
let listener = TcpListener::bind("127.0.0.1:9123").unwrap();
println!("listening started, ready to accept");
for stream in listener.incoming() {
thread::spawn(|| {
let mut stream = stream.unwrap();
stream.write(b"Hello World\r\n").unwrap();
});
}
}
Run Code Online (Sandbox Code Playgroud)
注意关于接受的范例; 你必须accept()自己发起请求(在这个例子中我们使用的incoming()是accept()每次调用的迭代器),这样你就可以真正控制它们的任务.
因此,我将实际的流处理代码放入一个单独的线程中,但它不需要非常短的请求(它只是意味着在处理第一个请求时你将无法处理第二个请求); 你也可以删除thread::spawn(|| { ... })那两行.额外线程的使用也提供了一定程度的隔离; 如果线程展开,整个服务器都不会死(但请记住,内存不足或者在展开时让析构函数发生混乱会导致整个服务器死掉).
简单的TCP回显服务器https://gist.github.com/seriyps/fd6d29442e16c44ba400
#![feature(phase)]
#[phase(plugin, link)] extern crate log;
extern crate green;
extern crate rustuv;
use std::io;
use std::os;
use std::io::{Listener,Acceptor,TcpStream};
// This is for green threads. If removed, will spawn 1 OS thread per client.
#[start]
fn start(argc: int, argv: *const *const u8) -> int {
green::start(argc, argv, rustuv::event_loop, main)
}
fn main() {
let host = "127.0.0.1";
let port = 8080;
let sock = io::TcpListener::bind(host, port).unwrap();
let mut acceptor = sock.listen();
for stream in acceptor.incoming() {
match stream {
Err(e) => warn!("Accept err {}", e),
Ok(stream) => {
spawn(proc() {
debug!("{}", handle_client(stream));
})
}
}
}
}
fn handle_client(mut stream: io::TcpStream) -> io::IoResult<()> {
info!("New client {}", stream.peer_name());
let mut buf = [0u8, ..4096];
loop {
let got = try!(stream.read(buf));
if got == 0 {
// Is it possible? Or IoError will be raised anyway?
break
}
try!(stream.write(buf.slice(0, got)));
}
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23435 次 |
| 最近记录: |