【问题标题】:BufWriter::write() doesn't write bytes to TcpStreamBufWriter::write() 不向 TcpStream 写入字节
【发布时间】:2018-08-05 20:54:46
【问题描述】:

我已经用 Rust 编写了一个回显服务器和客户端。这是我的代码:

服务器:

use std::net::{TcpListener, TcpStream};
use std::thread;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;

fn handle_connection(stream: TcpStream) {
    let stream_clone = stream.try_clone().unwrap();
    let mut reader = BufReader::new(stream);
    let mut writer = BufWriter::new(stream_clone);
    loop {
        let mut s = String::new();
        reader.read_line(&mut s).unwrap();
        writer.write(s.as_bytes()).unwrap();
    }
}

fn main() {
    let listener = TcpListener::bind("127.0.0.1:8888")
        .unwrap();
    for stream in listener.incoming() {
        thread::spawn(move || {
            handle_connection(stream.unwrap());
        });
    }
}

客户:

use std::net::TcpStream;
use std::io;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;

fn main() {
    let stream = TcpStream::connect("127.0.0.1:8888")
        .unwrap();
    let stream_clone = stream.try_clone().unwrap();
    let mut reader = BufReader::new(stream);
    let mut writer = BufWriter::new(stream_clone);
    loop {
        let mut s = String::new();
        let mut response = String::new();
        io::stdin().read_line(&mut s).unwrap();
        writer.write(s.as_bytes()).unwrap();
        reader.read_line(&mut response).unwrap();
        println!("{}", response.trim());
    }
}

当我测试代码时,服务器根本没有响应。我的猜测是write 方法有问题。我是对的,还是有其他原因?

【问题讨论】:

    标签: tcp rust


    【解决方案1】:

    您需要刷新缓冲区:writer.flush()

    固定服务器:

    use std::net::{TcpListener, TcpStream};
    use std::thread;
    use std::io::Write;
    use std::io::BufReader;
    use std::io::BufRead;
    use std::io::BufWriter;
    
    fn handle_connection(stream: TcpStream) {
        let stream_clone = stream.try_clone().unwrap();
        let mut reader = BufReader::new(stream);
        let mut writer = BufWriter::new(stream_clone);
        loop {
            let mut s = String::new();
            reader.read_line(&mut s).unwrap();
            writer.write(s.as_bytes()).unwrap();
            writer.flush().unwrap();
        }
    }
    
    fn main() {
        let listener = TcpListener::bind("127.0.0.1:8888")
            .unwrap();
        for stream in listener.incoming() {
            thread::spawn(move || {
                handle_connection(stream.unwrap());
            });
        }
    }
    

    客户:

    use std::net::TcpStream;
    use std::io;
    use std::io::Write;
    use std::io::BufReader;
    use std::io::BufRead;
    use std::io::BufWriter;
    
    fn main() {
        let stream = TcpStream::connect("127.0.0.1:8888")
            .unwrap();
        let stream_clone = stream.try_clone().unwrap();
        let mut reader = BufReader::new(stream);
        let mut writer = BufWriter::new(stream_clone);
        loop {
            let mut s = String::new();
            let mut response = String::new();
            io::stdin().read_line(&mut s).unwrap();
            writer.write(s.as_bytes()).unwrap();
            writer.flush().unwrap();
            reader.read_line(&mut response).unwrap();
            println!("{}", response.trim());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2012-12-23
      • 2016-02-19
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2016-10-01
      • 1970-01-01
      相关资源
      最近更新 更多