1 个稳定版本
1.0.2 | 2022年1月7日 |
---|
#196 在 WebSocket
18KB
152 行
cg-game-server
关于
这是一个主要由 trait 组成的库,旨在加速和标准化 CodeGame 游戏服务器的开发。
服务器的任务是让玩家之间保持连接,并使用最少的客户端状态防止他们作弊。所有决策都由客户端做出,但始终由服务器验证。
安装
将以下依赖项添加到您的 Cargo.toml 文件中
# this lib
cg-game-server = "0.1.0"
# CodeGame uses actix as its web framework, the traits in this project are built for actix
actix = "0.10"
actix-web = {version = "3", features = ["openssl"]}
actix-web-actors = "3"
# the project uses serde and serde_json to communicate with the clients
serde = {version = "1.0.133", features = ["derive"]}
serde_json = "1.0.74"
如何使用
TL;DR:有关示例,请参阅 官方游戏。
除了启动 Web 服务器的 main.rs
模块之外,每个 CodeGame 游戏服务器都由三个部分组成
让我们更深入地了解一下每个部分
事件
事件是表示操作的 structs
。事件在套接字和客户端之间流动,携带数据。
有两种类型的事件 ReceiveableEvents
(泛型中的 R
),由客户端发送到服务器(由套接字接收),以及 SendableEvents
(泛型中的 S
),在套接字之间发送。
在创建自己的事件时,建议您创建两个 enums
。请确保在枚举中包括标准事件。它应该看起来像这样
use cg_game_server::events::{Error, Join, Leave};
use actix::prelude::Message;
use serde::{Deserialize, Serialize};
use std::result::Result;
/// Deserialization `Result` for deserializing `ReceiveableEvents`
pub type ReceiveableEventSerde = Result<ReceiveableEvents, serde_json::Error>;
/// Events that the client may send to the server
#[derive(Serialize, Deserialize, Debug, Message, Clone)]
#[rtype(result = "()")]
#[serde(tag = "event_name")]
pub enum ReceiveableEvents {
#[serde(rename = "join")]
Join(Join),
#[serde(rename = "leave")]
Leave(Leave),
}
/// Events that the server may send to the client
#[derive(Serialize, Debug, Message, Clone)]
#[rtype(result = "()")]
#[serde(tag = "event_name")]
pub enum SendableEvents {
#[serde(rename = "error")]
Error(Error),
#[serde(rename = "join")]
Joined(Join),
#[serde(rename = "leave")]
Left(Leave),
}
套接字
Socket
(泛型中的 C
)是客户端连接的对象。它包含游戏逻辑,负责解释客户端发送的事件。此外,它将接收到的所有事件发送给客户端。
套接字需要实现以下内容
actix::Actor
-> 由 actix 需要,可以发送和接收消息actix::StreamHandler
-> 由 actix 需要,处理 WebSocket 通信actix::Handler<EventWrapper<S>>
由 CodeGame 需要,处理发送到套接字上的SendableEvents
actix::GameServerCommunications<G, R>
是 CodeGame 所需的,确保每个impl
ementation 的Socket
都可以访问基本游戏服务器通信功能。
服务器
GameServer
(泛型中的 G
)是中间人。它的 actix::Addr
传递给每个新的套接字。套接字可以向游戏服务器发送事件,服务器可以处理或转发到其他套接字。
服务器需要 impl
实现以下内容
actix::Actor
-> 由 actix 需要,可以发送和接收消息actix::Handler<EventWrapper<S>>
,这是 CodeGame 所需的,用于处理发送到套接字的SendableEvents
。actix::Handler<EventWrapper<Connect<C>>>
,这是 CodeGame 所需的,用于处理发送到服务器的Connect
事件。actix::Handler<EventWrapper<Disconnect>>
,这是 CodeGame 所需的,用于处理发送到服务器的Disconnect
事件。actix::Handler<EventWrapper<Join>>
,这是 CodeGame 所需的,用于处理发送到服务器的Join
事件。actix::Handler<EventWrapper<Leave>>
,这是 CodeGame 所需的,用于处理发送到服务器的Leave
事件。
依赖项
约 28MB
约 591K SLoC