Skip to content

网络编程项目

基于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的组成可以分为如下部分:

  1. <!doctype html> 声明文档类型,可以不写

  2. <html> 开始 和</html> 结束,属于html的根标签

    html
    <head></head> 头部标签,头部标签内一般有 <title></title>
  3. <body></body> 主体标签,一般用于显示内容

例如:

html
<html> 
    <head>
        <title>这是一个标题</title>
    </head>

    <body>
        <font color="red" size="5">hello, world</font>
    </body>
</html>

如果想要添加注释,可以使用 <!--我是注释 -->的方式.

也可以指定页面类型和字符编码,下面设置页面类型为html,并且字符编码为utf8

html
<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):

  1. 英文单词 red green blue …
  2. 使用16进制的形式表示颜色:#ffffff
  3. 使用rgb(255,255,0)

字体大小可以使用size属性,大小范围为1-7,其中7最大,1最小.

有时候需要使用换行标签 ,这是一个短标签 <br/>

与之对应另外还有一个水平线也是短标签, <hr/>,水平线也可以设置颜色和大小

列表标签

列表标签分无序列表和有序列表,分别对应<ul><ol>.

无序列表的格式如下:

html
<ul>
    <li>列表内容1</li>
    <li>列表内容2</li>

</ul>

无序列表可以设置type属性:

  • 实心圆圈:type=disc

  • 空心圆圈:type=circle

  • 小方块: type=square

有序列表的格式如下:

html
<ol>
    <li>列表内容1</li>
    <li>列表内容2</li>

</ol>

有序列表同样可以设置type属性

  • 数字:type=1,也是默认方式

  • 英文字母:type=atype=A

  • 罗马数字:type=itype=I

图片标签

图片标签使用<img>,内部需要设置若干属性,可以不必写结束标签

属性:

  • src=”3.gif” 图片来源,必写
  • alt=”小岳岳” 图片不显示时,显示的内容
  • title=”我的天呐” 鼠标移动到图片上时显示的文字
  • width=”600” 图片显示的宽度
  • height=”400” 图片显示的高度

例如:

html
<img src="3.gif" alt="小岳岳" title="我的天呐!" width="300" height="200" />

注意:当图片未定义宽高,图片百分百比例显示,如果只改变图片宽度或者高度,会等比例缩放

超链接标签

超链接标签使用<a>,同样需要设置属性表明要链接到哪里.

属性:

  • href=”http://www.itcast.cn”,前往地址,必填,注意要写http://
  • title=”前往传智” 鼠标移动到链接上时显示的文字
  • target=”_self”或者”_blank”,_self是默认值,在自身页面打开,_blank是新开页面前往连接地址

示例:

html
<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开发的主体流程:

对于我们来说,上述的框架基本没问题,除了处理客户端请求部分,我们可以考虑封装成一个函数,思考:函数参数如何设计?

处理客户端请求流程:

思考题:

  1. 由于每个响应消息都是分为四部分,可以考虑封装为函数,封装几个函数更方便?都分别对应什么功能?
  2. 目录请求相对复杂,需要遍历目录内的内容,也就是读内容,思考如何做?读到内容形成正文发送的时候,对应的文件类型应该是什么?