自己动手编写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协议主要由这几部分组成:
- URL 请求资源地址
- Request 请求
- Response 服务器响应
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.
首先,我们的思路是:
- 服务器端监听一个端口,等待请求;
- 当有请求发送到服务器端时,服务器端解析这个请求---Request,刚才已经看了Request请求包含的内容,主要是解析出请求的资源的URI;
- 服务器端找到这个资源,发送给客户端。
接下来,我们就开始动手编写一个简单的web server!
- 自己动手编写web server(一)
- 自己动手编写web server(二)
- 自己动手编写IoC容器(一)
- 自己动手编写一个VS插件(一)
- 自己动手编写一个VS插件(一)
- 自己动手编写操作系统(一)-----Boot Sector
- 自己动手编写操作系统(一)-----Boot Sector
- 自己动手开发一个 Web 服务器(一)
- 自己动手开发一个 Web 服务器(一)
- 自己动手开发一个 Web 服务器(一)
- Web Server程序编写学习笔记(一)
- 自己动手编写tomcat服务器(一)
- 自己动手写php web server
- 自己动手编写Web服务工具[解析]
- 自己动手编写Web服务解析工具
- 自己动手编写Web服务工具[执行]
- 自己动手编写Web服务工具[执行]
- 自己动手写web服务器一(浏览器的访问信息)
- Reduced Cost解释
- Latex 中如何使插图的位置不跑到开头而紧跟插入的文字后
- JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
- CSS学习之道:margin和padding
- lock 语句(C# )
- 自己动手编写web server(一)
- Android 内存优化测试
- 操作属性文件
- 每天坚持Crack Code(Day 6)
- java web项目生成验证码的解决方案
- 团队介绍
- ActionBar详解(七)--->ActionProvider使用示例
- 《Java语言程序设计(基础篇)》读书笔记(二)
- javascript 对url参数进行编码(解决中文乱码问题)