Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpWsCl 271 of 288 menu
◀ ▶

Клиент 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 в ветке ошибки.

Скажите, зачем после открытия разделяют поток на запись и чтение.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить