# IMDT_Dev_Server **Repository Path**: YicongYuan/IMDT_Dev_Server ## Basic Information - **Project Name**: IMDT_Dev_Server - **Description**: 游戏开发基础课作业服务器源码 - **Primary Language**: Lua - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-10-11 - **Last Updated**: 2023-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IMDT_Dev_Server [服务器项目](https://gitee.com/YicongYuan/IMDT_Dev_Server)在gitee开源,本文档仅描述服务器项目 - 张孟琛 2023214429 - 袁逸聪 2023214436 ## 运行指南 > bash start.sh 启动客户端 > bash killserver.sh {port} 根据端口杀死服务器进程 ## 要求实现 ### 新增public_info服务 在上次作业中,已经使用了中间服务userManager,来使得agent之间可共享信息,出于一致性考虑未改名 > ./src/userManager.lua ### redis实现用户信息持久化 鉴于云风没有提供skynet-redis api,用起来束手束脚 理论上,非关系型数据库应当能够支持多种基本数据类型、自由可嵌套的数组和字典 但是,由于只掌握了db:get(key),db:set(key,value)两个方法,实际使用中难以构建结构化数据 本次作业采用key表示账号,value写入以自定义格式编码的字符串表示user的信息 ## 经验记录 ### skynet与Lua类不适配 当skynet服务之间传输table时,会将table的所有属性序列化 默认的序列化只支持基本类型,无法传输function 因此,面向对象的编程习惯在使用Lua Service时会收到较大阻碍 或许,Lua中的数据本就不该也没有必要用对象表示 本项目最终采用了折中的办法,实则有点四不像 ```lua -- 服务间通信时将类转化成简单table function User:simple() return { username = self.username, password = self.password, id = self.id } end ``` ### sproto的角色 sproto不应只是一种传输手段,鉴于它定义了数据的格式,我们认为应当将其视作接口,承担起“协议”应有的作用 因此,本次开发改变了之前作业中【sproto只传字符串,通过约定分割字符串接包】的双端协作方式 否则,sproto就没有起到协议的作用,用什么方式传输信息仍需要大量的沟通成本,反复约定,不利于开发