Wydaje mi się, że borykam się ze std :: io :: TcpStream. Właściwie to próbuję otworzyć połączenie TCP z innym systemem, ale poniższy kod dokładnie emuluje problem.Rust persistent TcpStream
Mam serwer Tcp, który po otwarciu pisze po prostu "Hello World" do TcpStream, a następnie pętle, aby pozostawić połączenie otwarte.
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 {}
}
Cała klient robi, to próbuje odczytać jeden bajt z połączenia i wydrukować go.
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
}
}
}
}
Problem polega na tym, że mój klient pozostaje zablokowany podczas odczytu, dopóki nie zabiję serwera lub nie zamknę połączenia TCP. To nie jest to, czego chcę, muszę otworzyć połączenie TCP przez bardzo długi czas i wysyłać wiadomości pomiędzy klientem a serwerem. Co ja tu nie rozumiem? Mam taki sam problem z rzeczywistym systemem, z którym się komunikuję - odblokowuję się, gdy zabiję połączenie.
OK, więc nie będę w stanie wykonać prawidłowego asynchronicznego I/O ... bummer. Ale dlaczego nie mogę odczytać danych z TcpStream, dopóki połączenie nie zostanie zamknięte? Czy jest zaimplementowany do buforowania wszystkich danych do EOF? – Upio
@Upio, czy nie powiedziałeś tego: "Problem polega na tym, że mój klient pozostaje zablokowany podczas odczytu, dopóki nie zabiję serwera lub nie zamknę połączenia TCP"? Jest to "czytanie danych z TcpStream do czasu zakończenia połączenia", nieprawdaż? W każdym razie 'TcpStream' jest [' Reader'] (http://doc.rust-lang.org/std/io/trait.Reader.html), więc ma ['read_to_end()'] (http://doc.rust-lang.org/std/io/trait.Reader.html#method.read_to_end) metoda, która zużywa cały strumień, dopóki nie zostanie zamknięty. Czy to jest to, czego potrzebujesz? –
Przepraszam, jeśli byłem niejasny, już wiem, jak wchodzić w interakcję z czytelnikiem. Chciałbym tylko zrozumieć, dlaczego żadne dane nie są odczytywane po stronie klienta, dopóki połączenie się nie zamknie. Nawet ja używam read_byte(), blokuje się dopóki połączenie się nie zakończy.Jak to działa wewnętrznie? – Upio