- 环境变量注入(灵活、无需改代码):
export SERVER_ADDRESS=0.0.0.0
export SERVER_PORT=8080
cargo run
- 配置文件读取(示例为 TOML + serde):
# config.toml
[server]
address = "0.0.0.0"
port = 8080
// Cargo.toml
[dependencies]
serde = { version = "1.0", features = ["derive"] }
toml = "0.5"
// main.rs
use serde::{Deserialize, Serialize};
use std::fs;
use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
#[derive(Serialize, Deserialize, Debug)]
struct Config { server: ServerConfig }
#[derive(Serialize, Deserialize, Debug)]
struct ServerConfig { address: String, port: u16 }
fn main() -> std::io::Result<()> {
let p = std::env::var("CONFIG_PATH").unwrap_or_else(|_| "config.toml".into());
let cfg: Config = toml::from_str(&fs::read_to_string(p).unwrap()).unwrap();
let addr = format!("{}:{}", cfg.server.address, cfg.server.port);
let listener = TcpListener::bind(addr)?;
println!("listening on {}", addr);
for s in listener.incoming() { handle(&mut s?).unwrap(); }
Ok(())
}
fn handle(s: &mut TcpStream) -> std::io::Result<()> {
let mut b = [0; 1024];
let n = s.read(&mut b)?;
if n == 0 { return Ok(()); }
s.write_all(b"Hello, client!".as_ref())?;
Ok(())
}
- 直接连接本地服务示例(TCP):
use std::net::TcpStream;
use std::io::{Read, Write};
let mut s = TcpStream::connect("127.0.0.1:8080").expect("connect");
s.write_all(b"GET / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n").unwrap();
let mut buf = String::new();
s.read_to_string(&mut buf).unwrap();
println!("{}", buf);
- 高级套接字选项(Socket2,跨平台细粒度控制):
use socket2::{Domain, Type, Protocol, Socket};
use std::net::TcpListener;
let sock = Socket::new(Domain::AF_INET, Type::STREAM, Some(Protocol::TCP))?;
sock.bind(&"127.0.0.1:8080".parse()?)?;
let listener = TcpListener::from(sock);
listener.accept().map(|_| println!("accepted"))?;
Ok::<(), std::io::Error>(())
- HTTP 客户端示例(reqwest,含代理与 Cookie):
// Cargo.toml
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
// main.rs
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.redirect(reqwest::redirect::Policy::limited(5))
.cookie_store(true)
.build()?;
let r: HashMap<String, String> = client.get("https://httpbin.org/ip").send().await?.json().await?;
println!("{:#?}", r);
Ok(())
}
- 常用运行时与库选择:异步运行时用tokio,HTTP 客户端用reqwest,底层套接字细控用socket2。