2013-07-03 27 views
30

我正在尋找一個Rust服務器的例子。用Rust編寫的TCP服務器示例

「hello world」或echo服務器會很好。

+0

https://gist.github.com/thomaslee/4753338 – rags

+0

@rags:你應該是 –

+0

@rags的答案:其實,我決定修復它適用於Rust 0.7並自行發佈 - 如果您渴望,可隨時自行回答,我將刪除它的副本。你的要點也可以做更新。 –

回答

38

這是一個非常簡單的例子,使用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(); 
     }); 
    } 
} 

請注意關於接受的範例;你必須自己發起accept()請求(在這個例子中,我們使用incoming()迭代器,每次只調用accept()),所以你得到real控制哪些任務。因此,我將實際的流處理代碼放入一個單獨的線程中,但它不需要用於非常短的請求(這只是意味着您在處理第二個請求時不能處理第二個請求第一);你可以刪除關於這兩條線的thread::spawn(|| { ... })。使用額外的線程也會產生一定的隔離度;如果線程展開,整個服務器將不會死亡(但要記住,內存不足或在解繞過程中發生崩潰會導致整個服務器死機)。

+1

此代碼不再編譯,請你更新它? (我會,但我不知道如何產生任務) –

+3

@JeroenBollen:已更新。 –

+0

它再次不能在master上編譯。我認爲TcpListener轉移到了std :: net,但它似乎也改變了進程產生和流寫入 – wump

4

簡單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(()) 
} 
+0

這不再有效 - 請參閱我的評論[這裏](https://gist.github.com/seriyps/fd6d29442e16c44ba400#gistcomment-1562789)爲什麼。 – ferrouswheel