Клиент TCP в Rust
Клиентская сторона начинается с указания адреса в виде строки с хостом и портом. После успешного рукопожатия программа получает поток, через который можно отправлять данные на другой конец.
Подключим модуль сети и откроем поток к локальному порту семь тысяч:
use std::io::Write;
use std::net::TcpStream;
fn main() {
let mut stream = match TcpStream::connect("127.0.0.1:7000") {
Ok(s) => s,
Err(e) => {
eprintln!("connect error: {}", e);
return;
}
};
match stream.write_all(b"hello") {
Ok(()) => println!("sent"),
Err(e) => eprintln!("write error: {}", e),
}
}
Запись целиком отправляет все байты или возвращает ошибку. Пока сервер на том адресе не слушает, подключение завершится неудачей, и это видно в ветке сопоставления.
Тот же поток можно использовать повторно, если нужно отправить еще одну порцию:
use std::io::Write;
use std::net::TcpStream;
fn main() {
let mut stream = match TcpStream::connect("127.0.0.1:7000") {
Ok(s) => s,
Err(e) => {
eprintln!("connect error: {}", e);
return;
}
};
match stream.write_all(b"first") {
Ok(()) => {}
Err(e) => {
eprintln!("write error: {}", e);
return;
}
}
match stream.write_all(b"second") {
Ok(()) => println!("done"),
Err(e) => eprintln!("write error: {}", e),
}
}
Дан адрес:
let addr = "127.0.0.1:7000";
Откройте исходящий поток к этому адресу
и отправьте байты строки ping.
При успешной записи выведите ok.
Дан адрес:
let addr = "127.0.0.1:7000";
Попробуйте подключиться, когда на порту
никто не слушает, и напечатайте fail
в ветке ошибки открытия потока.
Скажите, чем запись всего буфера сразу отличается от записи по одному байту для сетевого потока.