自己动手编写web server(一)

来源:互联网 发布:数据分析师面试问题 编辑:程序博客网 时间:2024/05/05 16:54

前几天,本科生学弟问了一个他们的计算机网络课程设计题-----自己设计一个简单的web server,我看到这个问题时,觉得这个题对于刚大三的学生来说很有难度。要编一个web server ,首先,必须熟悉http协议;然后要熟悉网络编程,比如socket编程、IO流、多线程编程等。而这个题目也让我想起了自己最近面试经常遇到的问题----谈谈你对http协议的理解?

     所以,笔者对这个题目十分感兴趣,也十分手痒,想自己写一个server来试试,当然,理想目标是做成一个像tomcat那样的webserver,或许这只是个梦。。。。

    最近笔者一直在上班,偶尔在网上查了一下网友们的实现方法,大同小异,大都实现了静态页面的获取,无意间看到一本书--《how tomcat works》,网上大部分的实现都是参考这本书,而且这本书的目的也是教你一步步来编写一个web server,所以推荐这本书给各位,网上很多地方可以下到电子版。


   笔者也要开始动手写一个server,先从简单做起,实现静态页面读取,再做复杂一些的,这里先熟悉一下http协议吧!

HTTP协议

   http协议,大家每天都在使用,只要用浏览器,都在使用http协议,那么当我们在浏览器地址栏输入一个网站时,到底发生了什么呢?服务器如何与我们自己的浏览器交互呢?这貌似很复杂的问题,其实答案只需一个键盘按键就全部显示出来---“f12”,按下F12进入浏览器开发者模式,所有主流浏览器都有开发者模式。


上图是我用chrome浏览器浏览百度主页,我们可以看到,浏览器向服务器发送一次请求,就是Request;服务器发送了Response响应。

我们可以看出http协议主要由这几部分组成:

  1. URL 请求资源地址
  2. Request  请求
  3. Response 服务器响应
URL就不多说了,大家都懂的;Request与Response的组成有许多相似的地方,它们都有自己的Header部分,还有content---就是实际交互的内容;
Request Header,从上图可以看出,大部分都是“key:value”这种形式的数据

POST /examples/default.jsp HTTP/1.1Accept: text/plain; text/htmlAccept-Language: en-gbConnection: Keep-AliveHost: localhostUser-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)Content-Length: 33Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflatelastName=Franks&firstName=Michae

看上面的http请求例子:

第一行:方法-----请求资源地址----协议版本;请求方法是POST,请求的资源地址是/examples/default.jsp,协议版本是HTTP/1.1

http请求方法有很多,常用的是get、post方法。

接下来的几行,主要是描述客户端的一些信息,比如User-Agent表示客户端使用的浏览器内核版本,Accept-Language表示客户端接受的语言

最后一行,就是请求的主题,主要是客户端发送的一系列参数

相关技术

首先,我打算使用java语言来编写,java提供了强大的网络编程类库--java.net.*

我们需要使用的主要是这两个类:socket 和 serversocket.

首先,我们的思路是:

  1. 服务器端监听一个端口,等待请求;
  2. 当有请求发送到服务器端时,服务器端解析这个请求---Request,刚才已经看了Request请求包含的内容,主要是解析出请求的资源的URI;
  3. 服务器端找到这个资源,发送给客户端。

接下来,我们就开始动手编写一个简单的web server!

原创粉丝点击