有没有办法检查连接是否已关闭然后完成线程?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法检查连接是否已关闭然后完成线程?相关的知识,希望对你有一定的参考价值。

使用类似于this example的代码,连接将永远存在,因为无限循环永远不会停止。我修改了一下,以便允许读取不阻塞线程:

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

fn main() {
    let listener = TcpListener::bind("127.0.0.1:4444").unwrap();
    println!("Server is running on 127.0.0.1:4444 ...");

    for stream in listener.incoming() {
        let stream = stream.unwrap();
        stream
            .set_nonblocking(true)
            .expect("Failed to set stream as nonblocking");
        thread::spawn(move || handle_client(stream));
    }
}

fn handle_client(stream: TcpStream) {
    let mut stream = BufReader::new(stream);
    println!("New client logged");

    loop {
        let mut recv_buffer = String::new();
        println!("Before reading");
        let recv_data_size = stream
            .read_line(&mut recv_buffer)
            .expect("Error when reading line");

        if recv_data_size > 0 {
            println!("{}", recv_buffer);
        }
    }
}

客户端非常简单,然后连接将Hello!发送到服务器:

use std::io::prelude::*;
use std::net::TcpStream;

fn main() {
    let mut stream = TcpStream::connect("127.0.0.1:4444").unwrap();
    let _ = stream.write("Hello!".as_bytes());
}

当客户端发送其字符串并断开连接时,服务器进入无限循环并无限期地打印Before reading。它永远不知道何时关闭连接,即使客户很久以前就结束了它。

在Rust中是否有办法检查远程连接是否已关闭(如果可能,无需设置超时),然后正确完成运行它的线程?

答案

来自read_line的文档:

返回的空缓冲区表示流已达到EOF。

所以你可以这样做:

fn handle_client(stream: TcpStream) {
    let mut stream = BufReader::new(stream);
    println!("New client logged");

    loop {
        let mut recv_buffer = String::new();
        println!("Before reading");
        let recv_data_size = stream
            .read_line(&mut recv_buffer)
            .expect("Error when reading line");

        if recv_data_size > 0 {
            println!("{}", recv_buffer);
        } else {
            // stream has reached EOF
            break;
        }
    }
}

以上是关于有没有办法检查连接是否已关闭然后完成线程?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法检查延迟加载的组件(使用 React.Lazy)是不是已完成加载?

检查网络驱动器是否已连接为Windows服务[关闭]

检查 Elasticsearch 是不是已完成索引

有没有办法关闭代码片段中的命名建议?

Python强制关闭线程的一种办法(可行已用于项目)

[AndroidStudio]_[初级]_[配置自动完成的代码片段]