1 个稳定版本

1.0.2 2022年1月7日

#196WebSocket

GPL-3.0 许可证

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 所需的,确保每个 implementation 的 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