# SampleGameServer **Repository Path**: saltsakya/sample-game-server ## Basic Information - **Project Name**: SampleGameServer - **Description**: 一个示例游戏服务器 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-16 - **Last Updated**: 2023-11-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SampleGameServer ### 介绍 一个示例游戏服务器,支持游戏匹配、消息广播以及任何自定义行为逻辑。 ### 软件架构 软件架构说明 ![架构图](https://www.plantuml.com/plantuml/png/bLF1Zjem4BtdAqOvfIeWe9Mg8XgjG9LweANgVW1ox25hhMCZUuZKRldtEdOI14dLhZaOpxmPlvVdUN34B9qhbNn3WkaqXwsIg2aSPxCS_FwvzW6NFAAjqMwOmowHSCMSQojU4l3hBJ1EiiOL5CQeDbISZqUqFlIJq2MNjimtMAyTCP8ypxlgbnYuW2CBNumZ-0JfOlbXDlU_HNgFafhWkx4DwgDVWoQ6FoEju37i8JkzPeNajEuWsrqZ8eV3WIiPz8xTjKDTqjF--1MTOoN6exzyEKP_u-NkhV3ATvBGCjLeAMIPmcz8bIHIc0vk2QJwZxw2dNIqvamfLYZCyt16ZNQCdwJipNsKA-CmYog1c2sH1XY7Mjn29j4hg5mvG3CXEX9PJnJGRxwiOnh-58m_3yejLgR6LtMuy-rmO9pZYRAHZ4MEiku5HoydmJidVw5tO35VlXyfHCsDy7LaW-Z-hQ8-LzSXYCzqhpTI2nI-sxmDn1dO6gsHKyWisapxL7u4OY6plArf3FBHT_rWN0Ujcue-4Wa-6TTgEXdRswcCEVN-TnIp-FJRIPX0fo_21iJ_WH_A-S_-GUHViPVa0RKuL-eF) ### 测试流程 1. 运行 `demo_server.py` 启动服务器; 2. 逐个单元格运行 `demo_client.ipynb` 执行客户端程序; 3. 观察服务器的 log 及客户端 notebook 的输出。 ### 使用说明 1. 使用时编写 `Net.Server.ServerBase` 的派生类,选择性实现以下方法: 1. 主循环函数 `loop()` > 注意:`ServerBase` 的 `loop()` 为一个无限循环。为了检测 `KeyInteruptError`,派生类的 `loop()` 也应该是一个循环,但注意不要在其中调用父类的 `loop()`,以免进入无效的死循环。 2. 回调函数:可以通过 `Net.AddListener(event, callback)` 添加回调函数以监听 `Net.Net.NetEvents` 列出的事件。`ServerBase` 会自动注册以下回调函数: * `OnBinded(socket, msg)`:绑定接口时调用; * `onClientConnected(socket, msg)`:有新客户端连接时调用; * `onMessageRecieved(socket, msg)`:接收到新消息时调用; * `onClientClose(socket, msg)`:客户端关闭时调用; > 注意:回调函数会**卡住**网络模块(网络模块在调用回调函数后等待其返回),影响网络模块的吞吐量。因此回调函数应尽快返回,需要等待的操作应由 `loop()` 来完成。 2. 可以实现 `Protocol` 的派生类来定义不同的消息类型; 3. 程序基本框架参见 `demo_server.py`; #### 注意 存在客户端连接时强制终止服务端程序可能导致端口持续占用,无法立刻重启服务器。