溫馨提示×

Rust如何在Linux中實現網絡通信

小樊
35
2025-05-27 21:41:18
欄目: 編程語言

在Linux中使用Rust進行網絡通信,你可以使用標準庫中的std::net模塊,或者使用第三方庫如tokio、mio等。以下是使用std::net模塊進行基本的網絡通信的示例。

TCP通信

服務器端

use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 1024];
    loop {
        match stream.read(&mut buffer) {
            Ok(0) => break, // 連接關閉
            Ok(size) => {
                println!("Received: {}", String::from_utf8_lossy(&buffer[..size]));
                stream.write_all(b"ACK!") // 發送確認消息
                    .expect("Failed to send response");
            }
            Err(_) => {
                eprintln!("Error reading from socket");
                break;
            }
        }
    }
}

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:7878")?;
    println!("Server listening on port 7878");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                handle_client(stream);
            }
            Err(err) => {
                eprintln!("Error: {}", err);
            }
        }
    }

    Ok(())
}

客戶端

use std::io::{Read, Write};
use std::net::TcpStream;

fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("127.0.0.1:7878")?;
    println!("Connected to server");

    stream.write_all(b"Hello, server!")?;

    let mut buffer = [0; 1024];
    let size = stream.read(&mut buffer)?;
    println!("Received: {}", String::from_utf8_lossy(&buffer[..size]));

    Ok(())
}

UDP通信

發送端

use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("127.0.0.1:0")?;
    socket.connect("127.0.0.1:7878")?;

    socket.send_to(b"Hello, UDP server!", "127.0.0.1:7878")?;
    println!("Message sent to UDP server");

    Ok(())
}

接收端

use std::net::{UdpSocket};

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("127.0.0.1:7878")?;
    println!("UDP server listening on port 7878");

    let mut buffer = [0; 1024];
    let (size, _) = socket.recv_from(&mut buffer)?;
    println!("Received: {}", String::from_utf8_lossy(&buffer[..size]));

    Ok(())
}

異步網絡通信

對于需要高性能的應用程序,可以使用tokio這樣的異步運行時庫。以下是使用tokio進行TCP通信的簡單示例。

異步TCP服務器

use tokio::net::{TcpListener, TcpStream};
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let listener = TcpListener::bind("127.0.0.1:7878").await?;
    println!("Server listening on port 7878");

    loop {
        let (mut socket, _) = listener.accept().await?;

        tokio::spawn(async move {
            let mut buffer = [0; 1024];
            loop {
                match socket.read(&mut buffer).await {
                    Ok(0) => break,
                    Ok(size) => {
                        println!("Received: {}", String::from_utf8_lossy(&buffer[..size]));
                        if socket.write_all(b"ACK!").await.is_err() {
                            eprintln!("Failed to send response");
                            break;
                        }
                    }
                    Err(_) => {
                        eprintln!("Error reading from socket");
                        break;
                    }
                }
            }
        });
    }
}

異步TCP客戶端

use tokio::net::TcpStream;
use tokio::io::{AsyncWriteExt, AsyncReadExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut stream = TcpStream::connect("127.0.0.1:7878").await?;
    println!("Connected to server");

    stream.write_all(b"Hello, async server!").await?;

    let mut buffer = [0; 1024];
    let size = stream.read(&mut buffer).await?;
    println!("Received: {}", String::from_utf8_lossy(&buffer[..size]));

    Ok(())
}

在使用這些示例之前,請確保你的Linux系統上已經安裝了Rust編程語言。如果沒有,你可以訪問Rust官網下載并安裝。對于異步示例,你需要添加tokio作為依賴項到你的Cargo.toml文件中:

[dependencies]
tokio = { version = "1", features = ["full"] }

然后運行cargo build來編譯你的項目。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女