1 个不稳定版本
0.0.1 | 2024年6月20日 |
---|
#12 在 #reliability
18KB
260 行
ReUDP
ReUDP 是在不可靠的UDP之上提供可靠通信的层。它提供数据包确认、心跳,并支持客户端和服务器模式,确保通过UDP的可靠通信。
ReUDP是为Respark开发的,Respark是一个即将推出的开放世界MMO射击游戏。Respark结合了激烈的战斗、策略游戏和广阔的动态世界去探索。加入我们的社区Discord以获取最新新闻和开发进度。
描述
ReUDP的开发是为了解决在多人视频游戏中不使用慢速TCP而实现可靠通信的需求。鉴于UDP的性质,数据包丢失和顺序错误是常见问题。ReUDP在UDP之上添加了一个可靠性层,确保关键游戏数据正确并按顺序传递。
为什么它是可靠的
ReUDP的可靠性来自于其数据包确认、用于检测丢失连接的心跳以及支持客户端和服务器模式的组合。通过确认接收到的数据包和重发未确认的,ReUDP确保所有关键数据都到达目的地。
功能
- 数据包确认:确保可靠的数据传输。
- 心跳机制:检测和处理丢失的连接。
- 客户端和服务器模式:支持客户端-服务器通信模式。
- 并发处理:利用多个线程进行高效处理。
使用
将ReUDP添加到您的项目
将ReUDP添加到您的 Cargo.toml
[dependencies]
reudp = "0.0.1"
然后在项目中使用它
use reudp::{ReUDP, Mode, ReUDPError};
use std::time::Duration;
use std::net::SocketAddr;
fn main() -> Result<(), ReUDPError> {
// Create a new server instance
let mut server = ReUDP::new("127.0.0.1:8080", Mode::Server, Duration::from_secs(1), 1024)?;
// Parse the client address and handle potential errors
let server_addr: SocketAddr = "127.0.0.1:8080".parse().map_err(|e| ReUDPError::IoError(std::io::Error::new(std::io::ErrorKind::InvalidInput, e)))?;
// Create a new client instance
let mut client = ReUDP::new("127.0.0.1:8081", Mode::Client(server_addr), Duration::from_secs(1), 1024)?;
// Client sends a message to the server
client.send(b"Hello, server!".to_vec(), true)?;
loop {
// Server receives a message
if let Some((_addr, data)) = server.recv()? {
println!("Server received: {:?}", String::from_utf8(data).unwrap());
// Server sends a response back to the client
server.send(b"Hello, client!".to_vec(), true)?;
}
// Client receives a response from the server
if let Some((_addr, data)) = client.recv()? {
println!("Client received: {:?}", String::from_utf8(data).unwrap());
break;
}
}
Ok(())
}
数据包丢失与重传
ReUDP通过重传丢失的数据包并确认接收到的数据包来确保可靠的数据传输。心跳机制有助于检测和处理丢失的连接,使其适用于实时游戏和其他对延迟敏感的应用程序。
许可证
ReUDP采用MIT许可证。有关详细信息,请参阅LICENSE 文件。