项目整体介绍
项目功能:
- 注册用户
- 注册用户需要提供学校,专业,姓名
- 登录用户
- 登录用户需要提供之前注册的学校,专业,姓名
- 查询课表
- 查询课表需要输入学校,专业,班级(班级中包括了年级,例:151就是15级1班)
项目模块:
- 1.HTTP服务器框架
- 2.业务实现
- 1.爬学校的网站
- 2.数据库操作
- 3.页面制作
一.多线程HTTP服务器框架
1.1 读取请求并解析
1.1.1 解析首行(从socket中读取到数据按空格且切分)
- 解析方法:切分出来的第一部分就是方法
- 解析出URL
- 解析URL中的path
- 解析出query_string
1.1.2 解析heade
- 解析出Content_Length
- 解析出Content_Type
1.1.3 解析header
- 请求都是表单形式所以按照表单格式解析
1.2 计算请求计算响应并写回客户端
1.2.1 处理静态页面
写一个HTML文
1.2.2 处理动态页面
根据页面输入参数不同返回不同页面使用了CGI技术
CGI技术(通用网关接口,一种协议,一种标准)
CGI技术功能: 让HTTP服务器的底层框架和上层应用解耦合
CGI技术优点:对编程语言的要求低(只要可以访问标准输入输出就可以(SQL语言不能访问标准输入输出))
CGI技术缺点:进程的频繁创建销毁效率低(进程池,FastCGI)
- 服务器创建子进程
- 子进程进行程序替换(替换为url_path指定的可执行程序即 CGI程序)
- CGI程序:根据业务的具体需要,获取到用户输入的参数并进行动态页面的计算
- 子进程是通过匿名管道+环境变量获取到用户输入的参数
- 子进程进行重定向(把标准输入输出匿名管道的读端)
- 子进程通过匿名管道(匿名管道的写端)把计算得到的动态HTML写会父进程
- 父进程拿到子进程结果后拼装出一个HTTP响应
- 把响应写回socket中
二.业务实现
2.1 爬取有用信息
2.1.1借助libcurl第三方库实现获取网页的功能
- 输入目标是URL
输出结果是html
使用1.初始化句柄(curl_easy_init())
- 2.设置响应如何处理
- 3.发送请求
4.清理对象
2.2.2解析html文件解析出HTML中需要的专业,班级,课表
- 将解析出来的结果写进数据库之中的专业,班级写入学校表
- 将解析出来的课表写入课表中
2.2数据库操作
2.2.1 注册实现
- 获取到用户定义的参数
- 解析获取到的参数
- 将获取到的参数插入数据库之中
2.2.2登录实现
- 获取到参数(方法,query_string,body)
- 获取到Content_Length,再从标准输入中读取body
- 解析读取到的数据
- 将读取到的数据拼装到查询SQL语句中
- 执行查询语句对学校表中的数据进行查找,
- 找到了就跳转至搜索页面
- 找不到就跳转至注册页面
2.2.3 查询实现
- 获取到参数(方法,query_string,body)
- 获取到Content_Length,再从标准输入中读取body
- 解析读取到的数据
- 将读取到的数据拼装到查询SQL语句中
- 执行查询语句对课表中的数据进行查找,
- 找到了就讲课表打印出来
- 找不到就提示用户占时没有该课表