2 个版本
0.1.1 | 2023 年 7 月 8 日 |
---|---|
0.1.0 | 2023 年 7 月 7 日 |
#20 在 #tcp-client
51KB
358 行

WireBolt
WireBolt 是一个轻量级的 Rust TCP 包装器,抽象了线程问题,允许您通过轮询关注发送和接收来自客户端的消息。
示例
在服务器终端
cargo run --example hello_world -- server
在您喜欢的任意多个客户端终端中
cargo run --example hello_world
首先启动服务器,然后连接客户端。此示例仅有一个服务器,该服务器尽可能快地向所有客户端广播。然后客户端将消息回显给服务器。
服务器
async fn server() {
let Ok(mut net_server) = NetServer::new("127.0.0.1:5555").await else { return; };
let mut count = 0;
loop {
// -- Read errors
let errors = net_server.dequeue_errors();
for error in errors.iter() {
println!("Error Handled: {:?}", error);
}
// -- Read infos
let infos = net_server.dequeue_info();
for info in infos.iter() {
println!("Info Handled: {:?}", info);
}
// -- Read messages
let messages = net_server.dequeue();
for _message in messages.iter() {}
// -- Do not do anything if there are no connections
if net_server.connection_count().await == 0 {
tokio::time::sleep(Duration::from_millis(50)).await;
continue;
}
// -- Send messages
let message = format!("Message-{}", count);
net_server
.broadcast(message.clone().as_bytes().to_vec())
.await;
// -- Report every 25 thousand messages sent
if count % 25000 == 0 {
println!("Sent {} messages.", count);
}
count += 1;
}
}
客户端
async fn client() {
let Ok(mut net_client) = NetClient::new("127.0.0.1:5555").await else { return; };
let mut message_count = 0;
loop {
// -- If connection drops, exit application
if !net_client.is_connected() {
break;
}
// -- Read errors
let errors = net_client.dequeue_errors();
for error in errors.iter() {
println!("Error Handled: {:?}", error);
}
// -- Read infos
let infos = net_client.dequeue_info();
for info in infos.iter() {
println!("Info Handled: {:?}", info);
}
// -- Read messages
let messages = net_client.dequeue();
for message in messages.iter() {
message_count += 1;
// -- Convert message to string
let text = String::from_utf8(message.to_owned()).unwrap();
// -- Send message back to server
net_client
.enqueue(format!("Response: {}", text).as_bytes().to_vec())
.await;
// -- Report every 25 thousand messages
if message_count % 25000 == 0 {
println!("Message: {}", String::from_utf8(message.clone()).unwrap());
}
}
}
}
依赖项
~2.4–8.5MB
~57K SLoC