{"id":17308982,"url":"https://github.com/orestonce/chessgame","last_synced_at":"2025-10-28T11:31:18.859Z","repository":{"id":40523911,"uuid":"61990958","full_name":"orestonce/ChessGame","owner":"orestonce","description":"网络版中国象棋","archived":false,"fork":false,"pushed_at":"2024-08-14T00:21:52.000Z","size":3692,"stargazers_count":76,"open_issues_count":2,"forks_count":27,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-05T21:18:42.122Z","etag":null,"topics":["cpp","go","golang","qt"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/orestonce.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-06-26T13:49:16.000Z","updated_at":"2024-12-28T06:49:56.000Z","dependencies_parsed_at":"2024-06-19T00:14:05.551Z","dependency_job_id":"ad386a8e-839e-4b74-ad53-2d23ef7b0895","html_url":"https://github.com/orestonce/ChessGame","commit_stats":{"total_commits":67,"total_committers":2,"mean_commits":33.5,"dds":"0.014925373134328401","last_synced_commit":"44683c2e8bab742f767a37fdc3869f5d21d52b2f"},"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orestonce%2FChessGame","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orestonce%2FChessGame/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orestonce%2FChessGame/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/orestonce%2FChessGame/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/orestonce","download_url":"https://codeload.github.com/orestonce/ChessGame/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238642387,"owners_count":19506202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","go","golang","qt"],"created_at":"2024-10-15T12:07:26.907Z","updated_at":"2025-10-28T11:31:18.269Z","avatar_url":"https://github.com/orestonce.png","language":"C++","readme":"# ChessGame\n网络版中国象棋 是一个网络象棋桌, 目前功能有注册、登陆、下棋、聊天四大功能.\n\n## 部分截图\n![用户注册](screenshot/register.png)\n![用户登陆](screenshot/login.png)\n![游戏主界面](screenshot/playgame.png)\n\n## v2版本特点\n* 使用纯go语言重写了服务端逻辑，账号密码使用leveldb储存，不依赖外部数据库，可直接运行在windows、linux的电脑上\n* 使用websocket+json进行通信, 相对于二进制协议调试简单，不用手动分包，前端使用nginx代理后不占用对外端口\n* 自动从go代码生成协议的序列化、反序列化、c++的class定义，Encode、Decode不用手动操作了\n* 客户端使用rpchub与服务端进行通信\n  * 对外表现为同步形式的rpc.\n  * 客户端可直接注册服务端通知回调函数, 配合c++11 的lamda表达式，处理代码几行搞定\n* 支持多个房间\n\n## v2.5版本改进\n![v2.5版本结构图](screenshot/v2.5-layout.png)\n* 服务端分离为 gateway、game两大模块\n  * gateway 的作用是对客户端连接进行代理、数据分包、数据封包、死链接检测、把底层链接抽象为redis里的一条sessionId\n  * game 承载游戏全部逻辑, 只与redis直接通信, 支持客户端无感知的情况下快速重启进程\n* redis的作用\n  * 消息队列: 使用redis的list结构传递客户端连接信息、客户端读写数据信息\n  * game进程重启时的内存状态暂存区\n  * gateway进程的目前连接的session信息镜像，可直接用redis客户端看连接上来的客户端个数, sessionId信息\n* game进程重启逻辑\n  * 老的game进程收到kill信息后，停止消费redis消息队列里的消息，保存进程内的全部状态到redis，os.Exit(0)\n  * 新的game进程启动时，先从redis加载上一个进程的状态到内存, 然后开始处理redis消息\n  * 重启停机时间一般在100ms以内\n## v2.6版本改进\n * 引入mysql做数据储存引擎，不再使用game进程的内存保存数据。\n * 使用[ent](https://github.com/ent/ent)做内存实体映射数据库\n * 改进上个版本的明文储存密码的缺陷，使用[bcrypt](https://golang.org/x/crypto/bcrypt)对用户密码进行散列\n * 使用[FEN文件格式](https://www.xqbase.com/protocol/cchess_fen.htm)传递棋盘信息，规范化棋子名称\n * 合并了 gateway、game两个二进制，但是还是需要启动2个进程，使用[cobra](https://github.com/spf13/cobra) 处理命令行逻辑\n## v2.6.1版本改进\n * 支持使用chessdb.cn的[云api接口](https://www.chessdb.cn/cloudbook_api.html)自动下棋\n## ChessClient 需要\n* qt  \u003e= 5.6\n## 引用项目\n* 服务端:\n    * [websocket](https://github.com/gorilla/websocket)\n    * [ent](https://github.com/ent/ent)\n    * [bcrypt](https://golang.org/x/crypto/bcrypt)\n    * [cobra](https://github.com/spf13/cobra)\n\n## nginx代理websocket注意事项\n* 真实的ChessServer监听在127.0.0.1:8912位置, nginx配置为\n````\nserver {\n    listen       80;\n    server_name  example.com;\n    location / {\n        proxy_pass   http://127.0.0.1:8912;\n        proxy_redirect    off;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n    }\n}\n````\n## 使用docker-compose一键部署服务端\n1. 克隆代码到本地\n  `git clone https://github.com/orestonce/ChessGame`\n2. 启动docker-compose\n  `docker-compose up -d`\n## 编译、部署服务端\n1. 克隆本仓库代码到本地\n  `git clone https://github.com/orestonce/ChessGame`\n2. 设置 `GOPATH` 为克隆下来的的目录， 开始编译linux_amd64版服务端程序\n  `go run src/BuildServer/main.go`\n3. 编译完成，会产生1个二进制文件 bin/ChessServer\n4. 部署到服务器: 假设redis地址为127.0.0.1:6379, 服务器地址为ws://192.168.56.111:8912/ChessGame, 部署前缀为chess001, 数据库为 \"root:@tcp(mysql_server:3306)/chess?parseTime=true\u0026charset=utf8\"\n  ````\n  # 启动gateway\n  ./ChessServer Gate --laddr 192.168.56.111:8912 --raddr 127.0.0.1:6379 -rprefix chess001\n  # 启动game\n  ./ChessServer Game --raddr 127.0.0.1:6379 -rprefix chess001 --mysql_schema \"root:@tcp(mysql_server:3306)/chess?parseTime=true\u0026charset=utf8\"\n  ````\n![v2.5服务端1](screenshot/v2.5-server1.png)\n## 编译、配置客户端\n1. 克隆本仓库代码到本地\n  `git clone https://github.com/orestonce/ChessGame`\n2. 打开 `ChessClient/ChessClient.pro` ，开始编译\n  `ctrl + r`\n3. 在登陆页面点击 \"设置服务器\" 按钮, 输入服务器连接地址: `ws://192.168.56.111:8912/ChessGame`, 点击确认\n4. 回到登陆页面后，点击注册，输入用户名、密码点击确认即可注册成功\n5. 回到登陆页面后，输入用户名、密码点击登陆即可登入刚才在第4步创建的账号\n6. 再开启一个客户端进程，重复4, 5步，登陆另一个账号即可和自己玩耍了\n\n## 预编译的客户端、服务端\n   * [Go](https://github.com/orestonce/ChessGame/releases)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forestonce%2Fchessgame","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Forestonce%2Fchessgame","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Forestonce%2Fchessgame/lists"}