用Rust编写的TCP服务器示例
我正在寻找Rust中TCP服务器的示例用Rust编写的TCP服务器示例,tcp,rust,Tcp,Rust,我正在寻找Rust中TCP服务器的示例 “hello world”或echo服务器都很好。下面是一个使用std::net的非常简单的示例。它是针对当前的锈迹大师开发的,应该也适用于1.*上 注意这个例子;简化了;如果绑定、侦听或接受产生错误,您可能不希望它惊慌失措 使用std::io::Write; 使用std::net::TcpListener; 使用std::线程; fn main(){ 让listener=TcpListener::bind(“127.0.0.1:9123”).unwrap
“hello world”或echo服务器都很好。下面是一个使用
std::net
的非常简单的示例。它是针对当前的锈迹大师开发的,应该也适用于1.*上
注意这个例子;简化了;如果绑定、侦听或接受产生错误,您可能不希望它惊慌失措
使用std::io::Write;
使用std::net::TcpListener;
使用std::线程;
fn main(){
让listener=TcpListener::bind(“127.0.0.1:9123”).unwrap();
println!(“已开始侦听,准备接受”);
对于listener.incoming()中的流{
线程::spawn(| |{
让mut stream=stream.unwrap();
stream.write(b“Hello World\r\n”).unwrap();
});
}
}
注意关于接受的范例;您必须自己启动accept()
请求(在本例中,我们使用的是incoming()
迭代器,每次只调用accept()
),这样您就可以真正控制有哪些任务
因此,我将实际的流处理代码放在一个单独的线程中,但它不必用于非常短的请求(这只意味着在处理第一个请求时,您将无法处理第二个请求);您也可以删除关于这两行的thread::spawn(| |{…})
。额外线程的使用也提供了一定程度的隔离;如果线程展开,服务器作为一个整体不会死亡(但是请记住,在展开时内存不足或析构函数死机将导致整个服务器死亡)。简单TCP echo服务器
#![专题(阶段)]
#[阶段(插件、链接)]外部板条箱日志;
外部板条箱绿色;
外部板条箱;
使用std::io;
使用std::os;
使用std::io::{Listener,Acceptor,TcpStream};
//这是绿色线程。如果删除,将为每个客户端生成1个OS线程。
#[开始]
fn开始(argc:int,argv:*常数*常数u8)->int{
绿色::开始(argc、argv、rustuv::事件\u循环,主)
}
fn main(){
让host=“127.0.0.1”;
设端口=8080;
让sock=io::TcpListener::bind(主机,端口).unwrap();
让mut acceptor=sock.listen();
对于acceptor.incoming()中的流{
匹配流{
Err(e)=>warn!(“接受Err{}”,e),
Ok(流)=>{
繁殖(proc(){
调试!(“{}”,句柄_客户端(流));
})
}
}
}
}
fn handle_客户端(多数据流:io::TcpStream)->io::IoResult{
信息!(“新客户端{}”,stream.peer_name());
设mut buf=[0u8,…4096];
环路{
让get=try!(stream.read(buf));
如果get==0{
//可能吗?还是会引发IoError?
打破
}
试试!(stream.write(buf.slice(0,got));
}
好(())
}
@rags:你应该回答that@rags当前位置实际上,我决定为Rust 0.7进行修复,并亲自发布。如果您愿意,请随意回答,我将删除我的副本。你的要点也需要更新。请看,这段代码不再编译了,你能更新它吗?(我会的,但我不知道如何生成任务)@JeroenBollen:updated。它在master上也不再编译了。我估计TcpListener已经迁移到std::net了,但看起来生成和流写入的过程也发生了变化well@wump:已更新。这不再有效-请参阅我的评论了解原因。
#![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(())
}