Клиент WebSocket в Rust
Клиентская программа живет отдельно
от сервера приема и использует свой
крейт для протокола. Адрес задают
строкой со схемой ws, хостом
и портом, куда уже слушает сервер.
Создайте проект Cargo и добавьте зависимости без модуля шифрования:
cargo add tokio-tungstenite --no-default-features --features connect
cargo add tokio --features macros,rt-multi-thread
cargo add futures-util
Откроем адрес, разделим поток и отправим текстовый кадр:
use futures_util::{SinkExt, StreamExt};
use tokio_tungstenite::{connect_async, tungstenite::Message};
#[tokio::main]
async fn main() {
let url = "ws://127.0.0.1:3000";
let (stream, _response) = match connect_async(url).await {
Ok(pair) => pair,
Err(e) => {
eprintln!("{}", e);
return;
}
};
let (mut write, _read) = stream.split();
match write.send(Message::Text("hello".into())).await {
Ok(()) => println!("sent"),
Err(e) => eprintln!("{}", e),
}
}
Разделение дает половину для записи и половину для чтения. Пока сервер не запущен, открытие адреса вернет ошибку в ветке сопоставления.
После отправки можно дождаться одного кадра от сервера тем же разделением:
use futures_util::{SinkExt, StreamExt};
use tokio_tungstenite::{connect_async, tungstenite::Message};
#[tokio::main]
async fn main() {
let url = "ws://127.0.0.1:3000";
let (stream, _response) = match connect_async(url).await {
Ok(pair) => pair,
Err(e) => {
eprintln!("{}", e);
return;
}
};
let (mut write, mut read) = stream.split();
match write.send(Message::Text("hello".into())).await {
Ok(()) => {}
Err(e) => {
eprintln!("{}", e);
return;
}
}
match read.next().await {
Some(Ok(Message::Text(text))) => println!("got {}", text),
Some(Ok(_)) => println!("other"),
Some(Err(e)) => eprintln!("{}", e),
None => println!("closed"),
}
}
Дан адрес:
let addr = "ws://127.0.0.1:3000";
Откройте его, отправьте текст
ping и при успешной записи
выведите ok.
Дан адрес:
let addr = "ws://127.0.0.1:3000";
Попробуйте открыть адрес без
запущенного сервера и напечатайте
fail в ветке ошибки.
Скажите, зачем после открытия разделяют поток на запись и чтение.