有没有办法检查连接是否已关闭然后完成线程?
Is there a way to check if a connection has been closed then finish the thread?
使用类似于 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
的文档:
An empty buffer returned indicates that the stream has reached 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;
}
}
}
使用类似于 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
的文档:
An empty buffer returned indicates that the stream has reached 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;
}
}
}