8个稳定版本 (3个主要版本)
5.1.0 | 2024年7月15日 |
---|---|
5.0.0 | 2024年3月31日 |
4.0.0 | 2024年3月29日 |
3.1.0 | 2024年3月10日 |
2.0.2 | 2023年11月13日 |
#439 in 网络编程
每月下载量 256
44KB
895 行
Elytra Ping
轻松获取运行中的Minecraft服务器状态
此crate可以与运行Minecraft 1.7或更高版本的服务器交互。如果您有服务器的地址和端口,Elytra Ping可以检索服务器的描述、玩家数量、供应商和图标等元数据。服务器的响应(或不响应)也可以用来推断服务器是否在线且可使用。
安装
cargo add elytra-ping
用法
使用 ping_or_timeout
函数检索服务器状态和延迟,如果耗时过长则终止。
let (ping_info, latency) = elytra_ping::ping_or_timeout(
("mc.hypixel.net".to_string(), 25565),
std::time::Duration::from_secs(1),
).await.unwrap();
println!("{ping_info:#?}, {latency:?}");
// JavaServerInfo {
// players: 31757 of 200000,
// ...
// }, 62.84175ms
基岩版
let (ping_info, latency) = elytra_ping::bedrock::ping(
("play.cubecraft.net".to_string(), 19132),
std::time::Duration::from_secs(1),
3
).await.unwrap();
println!("{ping_info:#?}, {latency:?}");
// BedrockServerInfo {
// online_players: 10077,
// max_players: 55000,
// game_mode: Some(
// "Survival",
// ),
// ...
// }, 83ms
高级API
Elytra Ping可以通过 SlpProtocol
API进行自定义,该API提供与Java版服务器发送和接收数据包的接口。
let addrs = ("mc.hypixel.net".to_string(), 25565);
let mut client: elytra_ping::SlpProtocol = elytra_ping::connect(addrs).await?;
// Set up our connection to receive a status packet
client.handshake().await?;
client.write_frame(elytra_ping::protocol::Frame::StatusRequest).await?;
// Read the status packet from the server
let frame: elytra_ping::protocol::Frame = client
.read_frame(None)
.await?
.expect("connection closed by server");
let status: String = match frame {
elytra_ping::protocol::Frame::StatusResponse { json } => json,
_ => panic!("expected status packet"),
};
println!("Status: {}", status);
client.disconnect().await?;
依赖
~3–14MB
~172K SLoC