这学期选的限选课是C语言,主要的感受是课程少,实验多。课程学时是八周,每周2学时;而实验也是八周,可是每周4学时。由此看来,还是实验比较重要。应了那句老话,实践是检验真理的唯一标准。
实验课最后的综合实验是做一个简易的B/S系统——Http Server和精简的浏览器,整体框架如下:
我实现的功能:
以下基本要求:
总共分为两个程序:浏览器端、服务器端
A、浏览器端是一个精简的浏览器,可以是用户界面也可以是控制台模式,基本功能如下:
1、 能接收用户输入的使用IP地址的URL,如http://127.0.0.1:80/test.html
2、 能显示接收到的响应,包括响应头和响应文件。可以显示在控制台上,也可以显示在用户界面上,也可以调用系统浏览器打开
3、 通信使用HTTP协议,至少应支持GET
B、服务器端是一个精简的Web服务器(HTTP服务器),使用控制台模式,基本功能如下:
1、 能接收用户浏览器端GET请求
2、 能够读取服务器中存储的html文件,并返回给请求客户端
3、 使用一种并发技术 (多进程/多线程/多路IO复用)来提高处理请求的并发度
4、 支持简单的日志功能:记录(访问ip、访问时间、访问资源)等信息
都已经很好地实现了;
扩展要求实现了:
1、 服务器端支持错误处理,如要访问的URL不存在时回复404错误等
2、 服务器端为了提高处理速度,可以使用缓存机制,包括文件缓存内存数据结构的设计;
实验思路分析:
题目要求就是要做一个HttpServer和一个精简的浏览器。
而为了实现这两个东西,我们大概要用到套接字(socket)和http协议相关的知识,其中包括URL的知识。
然后,我们要有一个browser程序,一个server程序。此外还有一个test.html文件作为传送的目标。
打开server让它运作;然后打开browser,输入URL,回车,请求就会生成报文(http协议)并发送给server。server接收到报文后,解析报文,并返回相应的应答报文。
题目要求中可以服务器和客户端都可以是终端形式,为了简单明了我也就没有选择开发带图形界面的服务器及客户端,又客户端浏览器可以的工作方式是:输入一个合法的url,能够显示从web服务器端发来的响应报文,它包括响应头及响应正文。我没有查阅相关资料来调用系统浏览器显示从服务器端发来的响应报文,故只实现终端显示,符合老师实验的基本要求,这样代码也会很简洁。
服务器在选择并发处理的技术上我选择的是多线程方式,因为它比用多进程方式占用的资源要少很多,由于linux下的线程和进程操作在学习操作系统时比较熟悉而其它的技术不太熟故并发处理技术我选择了多线程技术。
最后:
由于在进行综合实验时,我有问过好几个队,但他们都已经早商量好了队员,都达到了老师规定一个团队人数上限,又其它队自己不是很熟,不好意思开口。当我仔细阅读完老师的实验要求时,我对自己完成这个实验很有信心,就决定自己一个人一组。
实验功能简单分析
首先:
我发现要完成这个综合实验肯定要在linux环境下实现经典的socket通信,要有客户端、服务器,两者还要能很好地通信。(说这些似多余)
其次:
由于http服务器要为多个客户端服务,故其势必要支持并发处理,这就要求服务器端要实现多线程。(我选的是多线程并发)
再次:
因为做的是浏览器和http服务器,故在通信过程中是一定要支持http协议的,在socket通信时是要考虑如何编写http协议。(浏览器和服务器都要支持http协议,能正确发送http报文)
再者:
服务器端虽然存有html文件,但客户端访问时肯定要实现服务器先从文件中读取已有的文件然后传送给浏览器,这就要求服务器有读写文件的功能。(服务器端要能保存访问者信息也要求读写文件)
最后:
浏览器因为要能输入一个url后就能访问特定资源,因此浏览器要能判别一个输入是不是合法的url,继而以此访问服务器。
具体实现:
下面是无论是浏览器还是服务器都会用到的完成读写功能的filerw.c:
#include<stdio.h>