在Linux中使用Rust進行網絡通信,你可以使用標準庫中的std::net
模塊,或者使用第三方庫如tokio
、mio
等。以下是使用std::net
模塊進行基本的網絡通信的示例。
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(())
}
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通信的簡單示例。
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;
}
}
}
});
}
}
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
來編譯你的項目。