我似乎在與std :: io :: TcpStream掙扎。我實際上試圖打開與另一個系統的TCP連接,但下面的代碼完全模擬了這個問題。鐵鏽持久性TcpStream
我有一個Tcp服務器,只需在打開時將「Hello World」寫入TcpStream,然後循環以保持連接打開。
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 {}
}
所有的客戶端都試圖從連接讀取一個字節並打印它。
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
}
}
}
}
現在的問題是我的客戶端仍然在讀取被阻塞,直到我殺死服務器或關閉TCP連接。這不是我想要的,我需要長時間打開TCP連接並在客戶端和服務器之間來回發送消息。我在這裏誤解了什麼?我與我正在通信的實際系統有完全相同的問題 - 一旦我終止連接,我只會變得暢通無阻。
好吧,我將無法做適當的異步I/O ...無賴。但是爲什麼在連接關閉之前我不能從TcpStream讀取數據呢?是否實施了緩衝所有數據直到EOF? – Upio 2014-09-03 07:08:09
@Upio,你不是這樣說的:「現在問題是我的客戶端在讀取前一直處於阻塞狀態,直到我終止服務器或關閉TCP連接」?這是「從TcpStream讀取數據直到連接關閉」,不是嗎?無論如何,'TcpStream'是一個[''Reader'](http://doc.rust-lang.org/std/io/trait.Reader.html),所以它具有['read_to_end()'](http:/ /doc.rust-lang.org/std/io/trait.Reader.html#method.read_to_end)方法,它會消耗所有的流直到它被關閉。那是你需要的嗎? – 2014-09-03 07:11:35
對不起,如果我不清楚,我已經知道如何與讀者互動。我只想知道爲什麼沒有數據在客戶端讀取,直到連接關閉。即使我使用read_byte(),它會阻塞直到連接終止。這在內部是如何工作的? – Upio 2014-09-03 07:19:12