广州做网站建设的公司哪家好,东莞招聘网有哪些比较好,网站建设汇报材料,系部 网站建设方案项目介绍
本项⽬主要实现⼀个⽹⻚版的五⼦棋对战游戏#xff0c;其主要⽀持以下核⼼功能#xff1a; • 用户管理:实现用户注册#xff0c;用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等。 • 匹配对战:实现两个玩家在网页端根据天梯分数匹配游戏对⼿其主要⽀持以下核⼼功能 • 用户管理:实现用户注册用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等。 • 匹配对战:实现两个玩家在网页端根据天梯分数匹配游戏对⼿并进行五子棋游戏对战的功能。 • 聊天功能:实现两个玩家在下棋的同时可以进⾏实时聊天的功能。 程序截图
开发环境 • Linux Centos-7.6 • VSCode/Vim • g/gdb • Makefile 核心技术 • HTTP/WebSocket • Websocket • JsonCpp • Mysql • C11 • BlockQueue • HTML/CSS/JS/AJAX 项目大流程 • 环境搭建在Linux环境下安装需要用到的的工具以及第三方库 • 框架设计 • 前置知识的了解 • 模块开发 配置开发环境
项目框架
项目期望用户访问服务器获取注册页面通过注册页面注册账号注册成功后在登录页面进行登录。登录成功后进入游戏大厅在游戏大厅中进行匹配对战匹配成功将进入游戏房间内与对手进行实时对战和实时聊天。 用户访问服务器获取的注册页面、登录页面、游戏大厅页面和游戏房间页面属于静态资源请求。进行注册请求、登录请求、进入游戏大厅后展示个人信息的个人信息请求、匹配对战请求和下棋聊天请求属于动态功能请求。 服务器流程图 模块解析
在项目中需要用到6个模块分别是
数据管理模块:基于mysql数据库进行数据管理以及封装数据管理模块实现数据库访问。 在数据管理模块中需要实现的功能有注册新用户功能、登录验证功能、通过用户名获取用户信息功能、通过用户id获取用户信息功能以及对战胜利和失败后对数据的更新功能。 网络服务器模块:基于websocketpp库搭建websocket服务器实现与客户端网络通信。 早网络服务器模块中websocketpp支持http协议和websocket协议需要实现的是http请求处理回调函数和websocket请求处理回调函数。其中HTTP请求的处理回调函数包含了静态资源请求处理、用户注册请求处理、用户登录请求处理和用户信息请求处理。websocket请求处理回调函数包含游戏大厅、游戏房间等长连接的请求处理。 session管理模块:封装session管理实现http客户端通信状态的维护及身份识别。 session管理模块是用于在浏览器中保存用户的通信状态和身份识别的当用户在注册或登录后进入了游戏大厅或游戏房间那么将会永久保存其Cookie当用户断开连接后在一定的时间内他的Cookie就会被销毁在登录时需要重新输入账号密码。 在线用户管理模块:对于进入游戏大厅游戏房间的长连接通信进行管理实现随时能够获取客户端连接进行消息的主动推送。 在线用户管理模块的作用是将用户id与游戏大厅或游戏房间连接起来在建立了websocket长连接后将玩家加入到游戏大厅或游戏房间。当游戏结束将玩家从游戏房间移除当玩家退出客户端后websocket连接断开将玩家从游戏大厅移除。除此之外还需要实现判断用户是否在线即在游戏大厅中或游戏房间中还需要通过玩家用户id去获取游戏大厅/游戏房间管理对应的通信连接。 游戏房间管理:对于同一个房间中的用户及动作进行处理(对战匹配下棋聊天退出)。 在游戏房间中游戏房间包含了房间id玩家数量房间状态、黑棋白棋玩家的id以及棋盘在线用户管理和数据模块管理的指针等字段。在游戏房间中需要实现的是下棋的动作、处理下棋动作、处理聊天动作和处理玩家退出房间的动作以及将动作处理广播给房间的所有玩家的方法。 游戏房间管理是需要实现的是对房间的管理因此需要一个房间的计数器、需要实现的是创建一个游戏房间通过房间id获取房间信息通过用户id获取所在的房间的信息删除房间等方法。 对战匹配管理:将所有玩家根据分数进行等级划分进行不同等级的对战匹配。 匹配对战分有三个段位普通、高手和大神三种段位分别使用三个匹配队列进行玩家的匹配队列的进入等待并且使用三个线程异步高效地处理三种玩家的匹配对战。 对于匹配队列来说不是使用队列而是使用双向链表来作为匹配队列。匹配队列需要的功能是出队入队、阻塞线程、移除指定元素等功能。 对于匹配队列的管理需要实现将玩家进行入队出队等操作。 将6个模块整合起来在服务器中进行业务处理:通过网络通信获取到客户端的请求提供不同的业务处理。
前置知识的学习
1.websocketpp的学习和使用。
本项目中使用websocketpp来搭建服务器因为websocketpp同时支持http和websocket。在本项目中HTTP用于注册、登录等服务请求中提供短链接服务。而websocket用于在游戏大厅或游戏房间中提供长连接并且服务器主动发送消息给客户端的服务。下面链接是关于websocket的介绍以及使用websocketpp搭建简单服务器的框架
websocket协议
我在做项目时的难点①HTTP请求响应和websocket请求响应的区别。②服务器搭建流程。③为什么连接句柄是使用lib::weak_ptr管理起来而不是使用lib::shared_ptr来管理。
解决
①TTP请求响应和websocket请求响应的区别
HTTP请求回调处理函数主要是处理来自客户端的HTTP请求它从连接对象中获取HTTP请求的正文并通过请求对象获取URI和方法等信息然后根据不同的方法和URI来进行相应的处理最后构建HTTP响应对象并发送回客户端。HTTP是一种无状态协议每个请求都是独立的。
WebSocket消息处理回调函数主要是处理来自客户端的WebSocket消息它从连接对象中获取WebSocket消息的内容并进行相应的处理逻辑。不像HTTP请求那样需要获取URI和方法等信息WebSocket是一种双向通信协议服务器和客户端可以在持久连接上进行实时双向通信。这个回调函数通过使用连接对象的 send 方法直接将响应消息发送回客户端。
②服务器搭建流程先实例化出websocketpp的server类对象通过server类对象设置日志等级、调度器、四种处理回调函数、进入监听状态、获取客户端新连接最后启动服务器。
③为什么连接句柄是使用lib::weak_ptr管理起来而不是使用lib::shared_ptr来管理。
hdl是wssrv.start_accept()创建出来的连接对象的引用他们两者会有互相引用的关系如果使用了lib::weak_ptr来管理hdl就不会发生内存泄漏。
MySQLClient库
JsonCpp
模块开发
数据库代码
数据库设计这边玩家的信息包含了玩家的用户id、用户名、用户密码、天梯分数、排位总场次和胜场总场次。其中用户id作为主键并且是自增长的而用户名和用户密码不能为空且用户名唯一。根据这个需求写出以下代码
drop database if exists online_gobang;
create database if not exists online_gobang;
use online_gobang;
create table if not exists user(id int primary key auto_increment comment 用户id,username varchar(32) unique key not null comment 用户名,password varchar(128) not null comment 用户密码,score int comment 分数,total_count int comment 总场次,win_count int comment 胜利场次
);
日志打印
#ifndef _M_LOGGER_H_
#define _M_LOGGER_H_
#includestdio.h
#includetime.h//正常
#define INF 0
//调试信息
#define DBG 1
//错误信息
#define ERR 2//strftime:将时间转换为指定格式的字符串
#define LOG(level,format,...) do{\time_t t time(NULL);\struct tm *lt localtime(t);\char buf[32];\strftime(buf,21,%H:%M:%S,lt);\fprintf(stdout,[%s %s:%d] format \n,buf,__FILE__,__LINE__,##__VA_ARGS__);\
}while(0)#define ILOG(format,...) LOG(INF,format,##__VA_ARGS__);
#define DLOG(format,...) LOG(DBG,format,##__VA_ARGS__);
#define ELOG(format,...) LOG(ERR,format,##__VA_ARGS__);
工具类模块开发
工具类模块开发代码
数据管理模块开发
数据管理模块开发代码
在测试代码的时候发现插入的数据长度太长也就是密码在被加密之后长度超过了我原本设置的password varchar(32)。因此我需要将其改成varchar(128)并且重新导入
[wjmhlhVM-12-9-centos myspace]$ mysql -uroot -p online_gobang.sql --重新导入
Enter password:
[wjmhlhVM-12-9-centos myspace]$ mysql -uroot -p
Enter password: Database changed
mysql desc user;
---------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
---------------------------------------------------------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | NO | UNI | NULL | |
| password | varchar(128) | NO | | NULL | |
| score | int(11) | YES | | NULL | |
| total_count | int(11) | YES | | NULL | |
| win_count | int(11) | YES | | NULL | |
---------------------------------------------------------------
6 rows in set (0.00 sec)mysql select * from user;
----------------------------------------------------------------------------------------
| id | username | password | score | total_count | win_count |
----------------------------------------------------------------------------------------
| 1 | xiaoming | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 | 1000 | 0 | 0 |
----------------------------------------------------------------------------------------
1 row in set (0.00 sec)在线用户管理模块开发
在线用户管理模块开发代码
在实现代码中需要注意的是当websocket的长连接断开后我在移除游戏大厅或游戏房间的在线用户管理的uid时而由于是使用unordered_map作为容器因此与之对应的通信连接conn就会失去一个映射关系而通信连接使用了uinque_ptr进行管理计数器直接减为0这个通信连接就会自动销毁。
房间管理模块开发
房间管理模块开发代码
session管理模块开发
session管理模块开发
游戏对战匹配模块开发
匹配对战模块开发代码
服务器网络通信模块开发
服务器网络通信模块开发
项目总结
1. 为什么做这个项目
为什么做这个C五子棋对战网页版的项目我总结了三点
①我学习了网络编程比如HTTP、socket编程等还没有通过项目实践过开发经验不足因此我需要做一个关于网络通信连接的项目来加深我对网络编程的理解和使用。
②我是学习C的一名计算机专业的学生对自己掌握的C的程度需要有项目的实践操作去检验自己的学习成果。
③在之前学习计算机技术实践都是通过从一些做题网站中去做题目来检验自己对知识的掌握以及写代码的能力但是却没有过去写一个项目来检验自己的代码逻辑和写代码的能力的而这个项目的开发能够很好地检验我自己的代码逻辑和写代码的能力。 2. 项目中都用到了那些技术
在项目中主要运用到了websocket协议和HTTP协议以及C11中的一些新特性比如包装器bing方法互斥锁、智能指针等等还有就是使用到了STL比如vector、list、unordered_map等以及是g/gcc,makefilevim/vscode等。 3. 讲一下项目都有那些功能大概是怎么实现的
在线五子棋对战网页版主要的功能有让用户通过浏览器访问服务器从而实现用户注册用户登录对战匹配实时对战和实时聊天功能。
实现的大概思路是
实现了6个模块第一个模块是数据管理模块这个模块是基于MySQL数据库进行数据管理并且封装了MySQL的C语言接口来进行数据管理。第二个模块是在线用户管理模块这个模块对于进入了的游戏大厅和游戏房间的长连接通信进行管理通过用户的uid与相对于的客户端的通信连接建立起映射关系服务器可以实现随时获取客户端通信连接进行消息的主动推送。第三个模块是房间管理模块在这个模块里面先是实现了房间类在房间类中实现了下棋、聊天等动作而再实现了一个房间管理的类通过房间的管理可以进行房间的创建、销毁、通过用户的id获取房间信息通过房间id获取房间信息等功能。第四个模块是session模块这个模块封装了session的管理实现了HTTP通信连接中客户端通信状态的维护和登录或进入游戏大厅或游戏房间时进行身份识别。第五个模块是游戏对战匹配模块在这个模块里面是将所有玩家根据分数吗进行了档次的划分使用多线程分别对同档次的玩家进行不同的对战匹配。第六个模块是网络服务器的模块开发在这个模块里面是基于了websocketpp来搭建了服务器实现了与客户端进行通信的功能。 4. 做的时候遇到过什么问题当时是怎么想的最后是怎么解决的
在做项目的过程中遇到了不少的技术问题。
①比如在使用websocketpp协议的时候一开始的时候没有掌握好HTTP协议和websocket协议的使用比如说在接受请求和发送响应它们是有区别的。一开始以为在响应的时候需要获取uri和方法然后根据uri和方法将那些响应的。然后当时在网上查了文档别人写的文章还问了一些类似chargpt的ai最后才发现原来websocket不需要获取请求中的uri可以直接通过send方法给客户端做出响应。
②一开始在设计user表的时候我把密码的长度设置了32个字符长度。开始的时候我给用户注册密码都是6位我没弄清楚为什么在报错的时候提示我是密码长度超出了设置的长度。于是我在MySQL的客户端上重新查看了describe user命令查看了表结构发现是32位然后我于是通过SHOW VARIABLES LIKE validate_password%命令去查看密码等级的设置并没有出现设置不匹配的原因后来我查了很多资料问了老师才知道是在密码加密之后密码长度会变长于是我就设置成128位。 5. 项目中最难的一个知识点
我认为在这个项目中最难的一个知识点是对于如何去使用websocketpp去搭建服务器这个点上。因为在做这个项目之前我都只用过HTTP去做过一个简单的服务器没有拓展到去学习websocket协议从而使用websocket去搭建一个拥有HTTP协议和websocket协议的服务器。 6. 有想过怎么扩展吗
想过给下棋玩家设置一个时间限制在规定时间内没有下棋动作那么就直接轮到对方下棋。
还有就是增加一个AI选手可以让玩家与AI进行对战。 项目整体代码链接
代码链接