代码下载地址:http://download.csdn.net/detail/u010959074/9572149
学习提示:
1. 在“桌面环境”中动手练习,若环境不流畅可选择WebIDE或字符界面。
2. 在教程下方“课程问答”中提出问题,或“共享桌面”寻求远程帮助。
3. 在教程下方“实验报告”中完成作业,记录心得。公开报告可以获得大家点评。
4. 在“我的代码库”中用GIT提交你的实验代码。
Web服务器
The way to learn a programming language is to write programs.
这门项目训练营最大的价值是实验楼和教师共同提供的教学服务,目的只有一个:让你把项目做出来并完全理解。所以请对自己负责,提出你遇到的任何问题,完成项目,你所花费的时间才有价值!
一、实验说明
欢迎参加C++语言经典项目实战训练营,在四周的时间里我们将一起完成四个小型及中型C++语言项目,涉及到C++语言技术的多方面。为了你能够有所收获,学习过程中务必注意:
进度很重要:必须跟上每周的进度,项目,问答。我们会认真对待每一位参与训练营的同学,请你不要因为困难半途而废。
问答很重要:遇到知识难点请多多提问,这是你的权利更是对自己负责的义务。
实践很重要:完成每周项目,解决项目中出现的一切问题。项目都提供完整的代码,但仅供学习中参考,应按照实验文档的思路自己实现,请勿直接拷贝代码。
实验报告很重要:详细记录你完成项目任务和解决问题的思路。
反馈很重要:请务必将你对课程的建议告诉我们,不同于视频,我们的文档可以很快更新升级以满足你的学习需求。
代码练习说明
实验楼环境使用GCC/G++ 4.8.4 编译环境。C++代码采用C++11标准。编写可以使用vim或gedit,并使用Git进行代码管理,实验报告需要以Markdown格式编写并公开。
这些技术都是很多程序员工作中天天用到的,如果你对其中任何知识不熟悉,可以先学习课程:
如果需要保存代码到我的代码库,则需要用到git,目前实验楼的代码库可以在实验环境或者你自己的电脑上提交,请务必注意git push时输入的用户名是你登陆实验楼的邮箱(不是你代码库用户名),如果你是第三方登陆的,则需要先更新邮箱及登录密码后才可以在实验楼外部使用。
程序编写与编译最基本的方法(#标志后为注释):
# 打开桌面上的Xfce终端并执行后续命令# 进入到/home/shiyanlou目录cd /home/shiyanlou# 创建并打开源文件hello.cpp
gedit hello.cpp# 在gedit(类似windows上的记事本)中输入代码# 保存退出# 编译hello.cpp
g++ -std=c++11 hello.cpp -o hello# 执行生成的二进制文件
./hello
二、项目简介
1. 介绍
本实验使用 C++ 实现一个Web服务器。
这个项目会学习C++网络开发,kqueue IO复用机制,熟悉Linux下的C++程序编译方法,Makefile编写。
本节实验项目比较复杂,提供的示例代码接近3000行,但代码逻辑简单,难点在kqueue IO复用机制的理解,尽量独立实现,遇到难点可以参考示例代码或到实验楼问答中提问。
2. 项目需求
编写一个Web服务器,程序具备的基本功能:
支持多个客户端连接
支持HTTP协议中的GET,HEAD,OPTION三个方法
支持通过浏览器访问多种类型的文件资源
支持多虚拟主机,每个虚拟主机可以配置独立的资源池
3. 知识点
本实验实践的知识点包括:
C++ 面向对象程序设计
基本的Makefile
C++ 网络编程
kqueue IO复用机制
HTTP 协议基础
4. 项目效果图
程序运行的截图如下所示:
5. 项目完整代码
项目完整代码可以通过wget下载获得:
# 下载程序代码wget http://labfile.oss.aliyuncs.com/courses/454/webserver.zip
# 解压代码
unzip webserver.zip
# 进入代码文件夹查看
cd webserver
三、程序设计与实现
3.1 需求分析
大家平时上网时,浏览器中显示的HTML网页都是来源自Web服务器。本项目通过一个实例介绍如何实现一个简单的Web服务器。
本项目中实现的Web服务器需要支持下面几个功能:
支持多个客户端连接
支持HTTP协议中的GET,HEAD,OPTION三个方法
支持通过浏览器访问多种类型的文件资源
支持多虚拟主机,每个虚拟主机可以配置独立的资源池
实现具备这些基本功能的Web服务器,我们首先需要了解HTTP协议以及IO复用机制,在上一节的项目中我们已经学习了一种IO复用方法epoll,本项目采用kqueue机制,与epoll非常类似。
3.2 HTTP协议
HTTP协议介绍的好文章非常多,这里只列出项目中需要的知识点,推荐大家系统学习HTTP协议,请阅读:
HTTP协议的一个主要特点就是客户端服务器模式,在上一个项目中我们有过介绍,基于socket的连接过程,如果大家没有印象可以去复习下。过程如下:
模型如下:
解释如下:
服务器端:
socket()创建监听Socket
bind()绑定服务器端口
listen()监听客户端连接
accept()接受连接
recv/send接收及发送数据
close()关闭socket
客户端:
socket()创建监听