Как подключиться по локальной сети в 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),
}
}
}
Объяснение
-
Сервер:
- Используется
TcpListenerдля прослушивания входящих соединений на указанном адресе и порту. - Функция
accept_asyncиз библиотекиtokio-tungsteniteиспользуется для приема вебсокетных соединений. - Каждое соединение обрабатывается в отдельном потоке с помощью функции
handle_connection.
- Используется
-
Клиент:
- Используется
TcpStreamдля установки соединения с сервером. - Функция
connect_asyncиз библиотекиtokio-tungsteniteиспользуется для установления вебсокетного соединения. - Каждое сообщение обрабатывается в отдельном потоке с помощью функции
handle_connection.
- Используется
Этот пример демонстрирует базовую конфигурацию для организации взаимодействия между сервером и клиентом через локальную сеть в Rust. Для более сложных сценариев можно расширять функциональность, добавляя обработку сообщений, аутентификацию и другие необходимые компоненты.