【问题标题】:Example TCP server written in Rust [closed]用 Rust 编写的示例 TCP 服务器 [关闭]
【发布时间】:2013-06-30 23:53:01
【问题描述】:

我正在寻找 Rust 中的 TCP 服务器示例。

“hello world”或回显服务器都很棒。

【问题讨论】:

标签: tcp rust


【解决方案1】:

这是一个使用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()),因此您可以真正控制有哪些任务.

因此,我已将实际的流处理代码放入一个单独的线程中,但它不需要用于非常短的请求(这只是意味着您在处理第一个请求时将无法处理第二个请求);您也可以删除关于这两行的thread::spawn(|| { ... })。额外线程的使用也提供了一定程度的隔离;如果线程展开,整个服务器不会死掉(但是请记住,内存不足或展开时出现析构函数恐慌会导致整个服务器死掉)。

【讨论】:

  • 这段代码不能编译了,能更新一下吗? (我会,但我不确定如何生成任务)
  • @JeroenBollen:已更新。
  • 它再次不再在 master 上编译。我认为 TcpListener 已移至 std::net,但似乎进程生成和流写入也发生了变化
  • @wump:已更新。
【解决方案2】:

简单的 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(())
}

【讨论】:

  • 这不再有效 - 请参阅我的评论 here 了解原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2021-07-27
  • 2011-09-11
  • 2016-09-12
相关资源
最近更新 更多