C++学习之游戏服务器开发十四QT登录器实现
目录
1.界面搭建
2.登录客户端步骤分析
3.拼接登录请求实现
4.发送http请求
5.服务器登录请求处理
6.客户端处理服务器回复数据
7.注册页面启动
8.qt启动游戏程序
1.界面搭建
查询程序依赖的动态库
ldd 程序名
do 1 cdocker rm `docker ps -aq` 静态编译游戏服务程序(部分依赖库静态链接到程序中的动
态编译)
原因:不想在容器中装诸多依赖项
查当前程序的依赖项
添加所有 依赖项 .a 到 Makefile 的依赖中
去掉 Makefile 中 -l 指定的链接库
游戏进程的启动脚本
首行 #!/bin/bash
启动游戏服务的命令 (./game)
死循环查询 game 进程是否存在
不存在则退出脚本
脚本创建游戏服务器镜像
有可执行的程序,有姓名文件,有启动脚本
指定工作路径
拷贝文件
暴露端口
指定执行点(执行脚本)
登陆服务器架构选择
BS 架构
效率要求不高,客户端向和服务器之间的数据交互比较单一:一条
请求对应一条回复
http 协议承载数据
#!/bin/bash
./game
while [ a == a ]
do
sleep 10
ps aux | grep -w game | grep -v grep
if [ 0 -ne $? ]
then
exit 0
fi
done
2.登录客户端步骤分析
http 协议
超(基于字符编码多媒体)文本(字符串)传输(基于短连接 tcp )
协议
请求或回复头: 属性名:属性值
http 请求(浏览器 --- 》服务器)
GET 请求(只有请求头)
POST 请求(头 + 身体):头和身体直接有两个回车
http 回复(服务器 --- 》浏览器)
类型决定于请求类型
包含头和身体
头:状态吗( 200--- 》成功)
身体: html 文件(显示为网页)
3.拼接登录请求实现
Nginx
概念:轻量化 web 服务器(高效的处理 http 报文)
apt 或者 yum 安装
配置文件目录: /etc/nginx/
日志配置文件: /var/log/nginx/
测试命令: nginx -t
重新加载配置文件: nginx -s reload
nginx 配置静态页面
创作一个 html 文件
将 html 文件放到 server 配置段指定的 root 目录下
location 配置段: index html 文件名(指定首页)
浏览器输入 192.168.64.148/XXXX.html-----> 服务器会向浏览器返
回 XXXX.html 的内容
4.发送http请求
nginx 配置反向代理
规划 url 和对应的网页服务器
proxy_pass 被代理的服务 ;
Nginx 配置 FastCgi
目的:跟客户端数据交互
5.服务器登录请求处理
CGI 程序处理流程
程序员自己写程序处理各种业务
CGI 程序的输入来自 web 服务器(标准输入和环境变量)
web 服务器会将 http 报文按照 CGI 标准转换后传递给 CGI 程序
CGI 程序返回 http 数据给 web 服务器(标准输出)
请求头: web 服务器设定环境变量们传递给 cgi 程序, CGI 程序通过
getenv 函数获取
请求的身体: web 服务器直接将身体的字符串传递给 cgi 程序的标准
输入
FastCGI 程序处理
CGI 程序缺点:资源消耗大,某些初始化操作冗余
FastCGI :一共启一个进程,通过 socket 接收和回复 web 服务器传来
的请求
数据是基于 FastCGI 标准编码过的二进制数据
6.客户端处理服务器回复数据
FCGI 库使用
运行 ./autogen.sh + ./configure + make + sudo make install 安装
Fcgi 库将 socket 数据转化成环境变量和标准输入交给 {} 内处理
编译后的程序既是 FastCGI 程序,也是 CGI 程序(可以通过命令行测
试数据处理是否正确)
通过 spawn-fcgi 工具将程序运行成守护进程
监听端口要和 nginx 配置的端口相同
7.注册页面启动
用户注册页面和处理
页面:点击提交后会向服务器发一个 POST 请求(身体是一串 用户
名 & 密码 字符串)
reg_cgi 程序,读取用户名和密码( fread 字符串处理) --- 》调用检
查用户和添加用户的函数
reg_cgi 程序,输出成功或失败的网页提示
添加用户函数: system 调用添加用户脚本(不关心返回值时)
查询用户是否存在函数: fork+exec 形式调用脚本(关心脚本执行是
否成功)
在 qt 界面的注册按钮槽函数中调用 QDesktopServices::openUrl ,传
入注册页 url----> 启动浏览器
登陆窗口搭建
密码输入栏 --- 》 echoMode : password
8.qt启动游戏程序
拼接登陆请求
创建 json 对象,通过【】设定 username 和 password 的值是输入框的
内容
基于 json 对象创建 jsondoc 对象, toJson 获取 json 格式的登陆请求
密码要生生成签名值后再拼接请求发送
qt 发送 http 请求
先创建 QNetworkAccessManager 对象
创建 QNetworkRequest 对象(指定 url ), setheader 设置必要的请
求头
调用 QNetworkAccessManager 对象的 post 函数发送请求( req 和请
求的身体部分)
接收服务器回复的 http
在主窗口类中定义属性 QNetworkReply ,用来存某次请求的回复对
象
接收完 post 或 get 函数的返回值后, connect 到某个回复处理函数
( finished )
回复处理函数中,若失败则弹出提示窗口
QCryptographicHash 类,
1. 创建生成器( QCryptographicHash::md5 )
2. addData 添加原始数据
3. result () .toHex() 获取签名值并转换成 16 进制的可显示数据
1
2
3
4 服务器处理登陆请求
取数据:先取长度( CONTENT_LENGTH ) ,CJSON 库解析数据并创
建 json 对象,调用 get 函数取用户名和密码
处理数据:调用 CheckUser 函数验证用户名和密码
回复登陆结果:创建 json 对象,设置 login_result 键的值( OK 或
Failed ),填 Content-Length 属性( json 字符串的长度), printf 整
个 json 字符串( ToFormatString );
启动游戏进程
调用 qproccess 的 startdetached ()
游戏客户端和 qt 程序放到同级目录