Mi sembra che stia lottando con lo std :: io :: TcpStream. In realtà sto provando ad aprire una connessione TCP con un altro sistema, ma il codice seguente emula esattamente il problema.Rust persistent TcpStream
Ho un server Tcp che scrive semplicemente "Hello World" sul TcpStream all'apertura e quindi su loop per mantenere aperta la connessione.
fn main() {
let listener = io::TcpListener::bind("127.0.0.1", 8080);
let mut acceptor = listener.listen();
for stream in acceptor.incoming() {
match stream {
Err(_) => { /* connection failed */ }
Ok(stream) => spawn(proc() {
handle(stream);
})
}
}
drop(acceptor);
}
fn handle(mut stream: io::TcpStream) {
stream.write(b"Hello Connection");
loop {}
}
Tutto il client tenta di leggere un singolo byte dalla connessione e stamparlo.
fn main() {
let mut socket = io::TcpStream::connect("127.0.0.1", 8080).unwrap();
loop {
match socket.read_byte() {
Ok(i) => print!("{}", i),
Err(e) => {
println!("Error: {}", e);
break
}
}
}
}
Ora il problema è il mio cliente rimane bloccato sulla lettura fino a quando uccido il server o chiudere la connessione TCP. Questo non è quello che voglio, ho bisogno di aprire una connessione TCP per un tempo molto lungo e inviare messaggi avanti e indietro tra client e server. Che cosa sto fraintendendo qui? Ho lo stesso identico problema con il sistema reale con cui sto comunicando - Divento sbloccato solo quando avrò terminato la connessione.
OK, quindi non sarò in grado di fare l'I/O asincrono corretto ... insopportabile. Ma perché non posso leggere i dati dal TcpStream fino a quando la connessione non è stata chiusa? È implementato per bufferizzare tutti i dati fino all'EOF? – Upio
@Upio, non hai detto questo: "Ora il problema è che il mio client rimane bloccato sulla lettura fino a quando non uccido il server o chiudo la connessione TCP"? Questo è "leggere i dati dal TcpStream fino a quando la connessione non è chiusa", non è vero? Ad ogni modo, 'TcpStream' è un [' Reader'] (http://doc.rust-lang.org/std/io/trait.Reader.html), quindi ha ['read_to_end()'] (http://doc.rust-lang.org/std/io/trait.Reader.html#method.read_to_end) metodo che consuma tutto lo stream fino a quando non viene chiuso. E 'quello di cui hai bisogno? –
Scusate se non sono chiaro, so già come interagire con il lettore. Vorrei solo capire perché nessun dato viene letto dal lato client fino alla chiusura della connessione. Anche io uso read_byte(), blocca fino a quando la connessione termina.Come funziona internamente? – Upio