网络编程项目
基于epoll实现http文件服务器
项目目标
实现一个web服务器
可以在浏览器页面请求资源页面
Web服务器开发准备
为了编写web服务器,我们需要学会编写html页面,以及掌握部分http协议知识,这两部分内容将在接下来进行介绍。这两个准备工作之后,还需要知道web服务器的通信流程是什么?还需要思考如何支持多浏览器并发访问!
Html语言基础
Html简介
Html(Hyper Texture Markup Language)是超文本标记语言,在计算机中以 .html或者.htm作为扩展名,可以被浏览器识别,就是经常见到的网页.
Html的语法非常简洁,比较松散,以相应的英语单词关键字进行组合,html标签不区分大小写,标签大多数成对出现,有开始,有结束,例如 <html></html>
,但是并没有要求必须成对出现.同时也有固定的短标签,例如<br/>
,<hr/>
.
学习html基本可以认为就是学习各种标签,标签也可以设置属性,例如<font color="red">hello, world</font>
,示例中color代表标签的颜色属性,red代表标签是红色字体,hello,world为实际显示的内容.可以新建一个文本文档,然后将后缀名修改.html文件,用代码编辑器打开该html文件可以编辑文件(例如notepad++),将上述内容保存到文件中,双击该文件可以看到如下效果:
Html的组成可以分为如下部分:
<!doctype html> 声明文档类型,可以不写
<html>
开始 和</html>
结束,属于html的根标签html<head></head> 头部标签,头部标签内一般有 <title></title>
<body></body>
主体标签,一般用于显示内容
例如:
<html>
<head>
<title>这是一个标题</title>
</head>
<body>
<font color="red" size="5">hello, world</font>
</body>
</html>
如果想要添加注释,可以使用 <!--我是注释 -->
的方式.
也可以指定页面类型和字符编码,下面设置页面类型为html,并且字符编码为utf8
<meta http-equiv="content-Type" content="text/html; charset=utf8">
Html标签属性,可以双引号,单引号,或者不写
Html标签介绍
题目标签
共有6种,<h1>
,<h2>
,…<h6>
,其中<h1>
最大,<h6>
最小
文本标签
<font>
标签,可以设置颜色和字体大小属性
颜色表示方法(可以参考网站: http://tool.oschina.net/commons?type=3):
- 英文单词 red green blue …
- 使用16进制的形式表示颜色:#ffffff
- 使用rgb(255,255,0)
字体大小可以使用size属性,大小范围为1-7,其中7最大,1最小.
有时候需要使用换行标签 ,这是一个短标签 <br/>
与之对应另外还有一个水平线也是短标签, <hr/>
,水平线也可以设置颜色和大小
列表标签
列表标签分无序列表和有序列表,分别对应<ul>
和<ol>
.
无序列表的格式如下:
<ul>
<li>列表内容1</li>
<li>列表内容2</li>
…
</ul>
无序列表可以设置type属性:
实心圆圈:
type=disc
空心圆圈:
type=circle
小方块:
type=square
有序列表的格式如下:
<ol>
<li>列表内容1</li>
<li>列表内容2</li>
…
</ol>
有序列表同样可以设置type属性
数字:
type=1
,也是默认方式英文字母:
type=a
或type=A
罗马数字:
type=i
或type=I
图片标签
图片标签使用<img>
,内部需要设置若干属性,可以不必写结束标签
属性:
src=”3.gif”
图片来源,必写alt=”小岳岳”
图片不显示时,显示的内容title=”我的天呐”
鼠标移动到图片上时显示的文字width=”600”
图片显示的宽度height=”400”
图片显示的高度
例如:
<img src="3.gif" alt="小岳岳" title="我的天呐!" width="300" height="200" />
注意:当图片未定义宽高,图片百分百比例显示,如果只改变图片宽度或者高度,会等比例缩放
超链接标签
超链接标签使用<a>
,同样需要设置属性表明要链接到哪里.
属性:
href=”http://www.itcast.cn”
,前往地址,必填,注意要写http://
title=”前往传智”
鼠标移动到链接上时显示的文字target=”_self”
或者”_blank”
,_self
是默认值,在自身页面打开,_blank
是新开页面前往连接地址
示例:
<a href="http://www.itcast.cn" title="去往传智" target="_self" >来传智</a>
当我们访问某个网站的时候,当请求的资源不存在,经常会给我们报告一个错误,显示为404错误,一般会给请求用户返回一个错误页,大家可以自行尝试一下编写一个我们自己的错误页.
web服务器开发
我们要开发web服务器已经明确要使用http协议传送html文件,那么我们如何搭建我们的服务器呢?注意http只是应用层协议,我们仍然需要选择一个传输层的协议来完成我们的传输数据工作,所以开发协议选择是TCP+HTTP,也就是说服务器搭建浏览依照TCP,对数据进行解析和响应工作遵循HTTP的原则.
这样我们的思路很清晰,编写一个TCP并发服务器,只不过收发消息的格式采用的是HTTP协议,如下图:
为了支持并发服务器,我们可以有多个选择,比如多进程服务器,多线程服务器,select,poll,epoll等多路IO工具都可以,甚至如果读者觉得libevent非常熟练的话,也可以使用libevent进行开发.
基于epoll的web服务器
由于我们知道epoll在大量并发少量活跃的情况下效率很高,所以本文以epoll为例,介绍epoll开发的主体流程:
对于我们来说,上述的框架基本没问题,除了处理客户端请求部分,我们可以考虑封装成一个函数,思考:函数参数如何设计?
处理客户端请求流程:
思考题:
- 由于每个响应消息都是分为四部分,可以考虑封装为函数,封装几个函数更方便?都分别对应什么功能?
- 目录请求相对复杂,需要遍历目录内的内容,也就是读内容,思考如何做?读到内容形成正文发送的时候,对应的文件类型应该是什么?