Reputation: 555
I've written an echo server and client in Rust. Here is my code:
Server:
use std::net::{TcpListener, TcpStream};
use std::thread;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;
fn handle_connection(stream: TcpStream) {
let stream_clone = stream.try_clone().unwrap();
let mut reader = BufReader::new(stream);
let mut writer = BufWriter::new(stream_clone);
loop {
let mut s = String::new();
reader.read_line(&mut s).unwrap();
writer.write(s.as_bytes()).unwrap();
}
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:8888")
.unwrap();
for stream in listener.incoming() {
thread::spawn(move || {
handle_connection(stream.unwrap());
});
}
}
Client:
use std::net::TcpStream;
use std::io;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;
fn main() {
let stream = TcpStream::connect("127.0.0.1:8888")
.unwrap();
let stream_clone = stream.try_clone().unwrap();
let mut reader = BufReader::new(stream);
let mut writer = BufWriter::new(stream_clone);
loop {
let mut s = String::new();
let mut response = String::new();
io::stdin().read_line(&mut s).unwrap();
writer.write(s.as_bytes()).unwrap();
reader.read_line(&mut response).unwrap();
println!("{}", response.trim());
}
}
When I test the code, the server don't respond at all. My guess is that something is wrong with the write
method. Am I right, or is there another reason?
Upvotes: 2
Views: 1965
Reputation: 576
You need to flush the buffers: writer.flush()
Fixed server:
use std::net::{TcpListener, TcpStream};
use std::thread;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;
fn handle_connection(stream: TcpStream) {
let stream_clone = stream.try_clone().unwrap();
let mut reader = BufReader::new(stream);
let mut writer = BufWriter::new(stream_clone);
loop {
let mut s = String::new();
reader.read_line(&mut s).unwrap();
writer.write(s.as_bytes()).unwrap();
writer.flush().unwrap();
}
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:8888")
.unwrap();
for stream in listener.incoming() {
thread::spawn(move || {
handle_connection(stream.unwrap());
});
}
}
Client:
use std::net::TcpStream;
use std::io;
use std::io::Write;
use std::io::BufReader;
use std::io::BufRead;
use std::io::BufWriter;
fn main() {
let stream = TcpStream::connect("127.0.0.1:8888")
.unwrap();
let stream_clone = stream.try_clone().unwrap();
let mut reader = BufReader::new(stream);
let mut writer = BufWriter::new(stream_clone);
loop {
let mut s = String::new();
let mut response = String::new();
io::stdin().read_line(&mut s).unwrap();
writer.write(s.as_bytes()).unwrap();
writer.flush().unwrap();
reader.read_line(&mut response).unwrap();
println!("{}", response.trim());
}
}
Upvotes: 5