Как подключиться по локальной сети в Rust?

Как подключиться по локальной сети в Rust? - коротко

Для подключения по локальной сети в Rust можно использовать библиотеку tokio для асинхронного ввода-вывода и std::net::UdpSocket или std::net::TcpListener для создания сокетов. Пример использования UDP сокета:

use tokio::net::{UdpSocket, SocketAddr};
#[tokio::main]
async fn main() {
 let socket = UdpSocket::bind("0.0.0.0:8080").await.unwrap();
 let mut buf = [0; 1024];
 let (amt, addr) = socket.recv_from(&mut buf).await.unwrap();
 println!("Received {} bytes from {}", amt, addr);
}

Как подключиться по локальной сети в Rust? - развернуто

В языке программирования Rust существует несколько способов для организации взаимодействия между приложениями через локальную сеть. Один из наиболее распространенных и удобных методов - использование библиотеки tokio для асинхронного программирования и tokio-tungstenite для реализации вебсокетов. Этот подход позволяет создавать высокопроизводительные сетевые приложения с минимальными затратами на конфигурацию и управление.

Для начала необходимо установить соответствующие библиотеки. Это можно сделать с помощью менеджера пакетов Cargo:

cargo add tokio
cargo add tokio-tungstenite

После установки библиотек можно приступить к написанию кода. Пример простого сервера и клиента, общающихся через вебсокеты, представлен ниже:

Сервер

use tokio::net::{TcpListener, TcpStream};
use tokio_tungstenite::accept_async;
use futures_util::stream::StreamExt;
#[tokio::main]
async fn main() {
 let addr = "127.0.0.1:8080".parse().unwrap();
 let listener = TcpListener::bind(&addr).await.unwrap();
 println!("Server listening on {}", addr);
 while let Ok((stream, _)) = listener.accept().await {
 let stream = accept_async(stream).await.unwrap();
 tokio::spawn(handle_connection(stream));
 }
}
async fn handle_connection(mut stream: tokio_tungstenite::WebSocketStream<TcpStream>) {
 while let Some(message) = stream.next().await {
 match message {
 Ok(_) => (),
 Err(e) => println!("Error during WebSocket handshake: {}", e),
 }
 }
}

Клиент

use tokio::net::{TcpStream, ToSocketAddrs};
use tokio_tungstenite::connect_async;
use futures_util::stream::StreamExt;
#[tokio::main]
async fn main() {
 let addr = "127.0.0.1:8080".to_socket_addrs().unwrap().next().unwrap();
 let (mut stream, _) = connect_async(addr).await.unwrap();
 println!("Connected to server");
 tokio::spawn(handle_connection(stream));
}
async fn handle_connection(mut stream: tokio_tungstenite::WebSocketStream<TcpStream>) {
 while let Some(message) = stream.next().await {
 match message {
 Ok(_) => (),
 Err(e) => println!("Error during WebSocket communication: {}", e),
 }
 }
}

Объяснение

  1. Сервер:

    • Используется TcpListener для прослушивания входящих соединений на указанном адресе и порту.
    • Функция accept_async из библиотеки tokio-tungstenite используется для приема вебсокетных соединений.
    • Каждое соединение обрабатывается в отдельном потоке с помощью функции handle_connection.
  2. Клиент:

    • Используется TcpStream для установки соединения с сервером.
    • Функция connect_async из библиотеки tokio-tungstenite используется для установления вебсокетного соединения.
    • Каждое сообщение обрабатывается в отдельном потоке с помощью функции handle_connection.

Этот пример демонстрирует базовую конфигурацию для организации взаимодействия между сервером и клиентом через локальную сеть в Rust. Для более сложных сценариев можно расширять функциональность, добавляя обработку сообщений, аутентификацию и другие необходимые компоненты.