2013-07-03 8 views
30

私はRustのTCPサーバの例を探しています。例Rustで書かれたTCPサーバ

「hello world」またはエコーサーバーのいずれかが優れています。

+0

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

+0

@rags:あなたはその –

+0

@ragsの答えを作る必要があります:実際に、私は修正することにしましたそれは錆0.7のためにそれ自身を投稿してください。あなたが熱望しているなら、あなた自身でそれに答えることが自由であり、私はそれを削除します。あなたの要点は更新されることもできます。 –

答えて

38

ここには、std::netを使用した非常に簡単な例があります。これは現在のRustの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()リクエストを自分で開始する必要があります(この例では、毎回accept()という呼び出しを行うincoming()イテレータを使用しています)。のタスクを制御します。

実際、ストリーム処理コードは別のスレッドに入れていますが、非常に短い要求である必要はありません(2番目の要求を処理することができないことを意味します)。最初);それらの2行についてthread::spawn(|| { ... })を削除することもできます。追加のスレッドを使用すると、ある程度の分離も得られます。スレッドが巻き戻された場合、サーバー全体が死ぬことはありません(ただし、メモリが不足している、またはデストラクタがパニックしていると解凍するとサーバー全体が停止することに注意してください)。

+1

このコードはもうコンパイルされません。更新できますか? (私はしかし、私はどのようにタスクを生成するか分からない) –

+3

@ JeroenBollen:更新されました。 –

+0

もう一度マスターでコンパイルされません。私は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

関連する問題