计算机网络课程设计报告题目:简单Web服务器设计与实现专业:学号:学生姓名:指导教师:摘要 (2)关键词 (2)1. 前言 (3)1.1 课程设计前准备 (4)1.2 课程设计的内容 (5)1.3 课程设计要求 (5)1.4 课程设计平台 (5)2. Web服务器的工作原理 (5)2.1 HTTP协议的作用原理 (5)2.2 Java开发语言相关知识与技术 (6)3. 开发环境及套字接编程 (11)3.1 Web服务器的开发环境 (11)3.2 Web服务器的套接字编程 (12)4. WEB服务器的设计与实现 (13)4.1 Web服务器的程序设计流程 (13)4.2 用Java实现Web服务器的主要设计步骤及程序 (14)5. 测试运行 (21)5.1 调试运行 (21)6.结束语 (23)参考文献 (24)WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤:连接,请求,应答,关闭应答。
在课程设计中,系统开发平台为Win7,程序设计语言采用Java,程序运行平台为Eclipse。
在程序设计中,采用了结构化与面向对象两种解决问题的方法。
程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。
关键词Java;HTTP;Web服务器Internet是目前世界上最大的计算机互联网络,与大家的生活、学习、工作有着越来越密切的关系,它遍布全球,将世界各地各种规模的网络连接成一个整体,其用户群十分庞大,因此,建设一个好的Web站点对于一个机构的发展十分重要。
近年来,随着网络用户要求的不断提高及计算机科学的迅速发展,特别是数据库技术在Internet中的广泛应用,Web站点向用户提供的服务将越来越丰富,越来越人性化。
本课程设计主要解决由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信的Web服务器的程序设计。
1.1 课程设计前准备以下的工作均是建立在大量的调查基础上的,是Web服务器开发前期准备工作所解决的问题。
(1)Java简介Java是由sun公司开发的一种新型的面向对象的程序设计语言,主要用于web页面的设计[1]。
Java语言的流行除了因为它能够编制嵌入HTML文件中的Applet外,还在于Java语言本身的面向对象、简单、平台无关性、安全性、多线程等特点。
Java语言的发展颇具传奇性,它与Internet的WWW的迅猛发展是分不开的。
由于其发展迅速,有人将它比喻为Internet上的世界语。
前面讲到在Internet上Web页面的设计采用的是HTML语言,用户借助于Web浏览器(如Netscape,HotJava,IE等),可以访问到远程web服务器上静态的、具有超链接的Web页面[2]。
(2)HTTP协议简介HTTP 协议是应用层的协议,定义了服务器端和客户端之间文件传输的沟通方式。
HTTP协议用于从WWW服务器传输超文本到本地浏览器的传送协议。
由于HTTP协议支持的服务不限于WWW,还可以是其它服务,它允许用户在统一的界面下,采用不同的协议访问不同的服务。
它可以使浏览器更加高效,使网络传输减少。
它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等[3]。
1.2 课程设计的内容(1)熟悉WWW服务器和WEB服务器的工作原理;(2)熟悉套接字编程的相关知识;(3)完成一个简单的WEB服务器的设计与实现,要求能够通过HTTP GET命令获得一个简单的HTML文件;(4)运行该服务器,并编写一个简单的HTML文件完成测试。
1.3 课程设计要求(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。
1.4 课程设计平台Windows7系统;Eclipse软件平台2 Web服务器的工作原理2.1 HTTP协议的作用原理WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。
WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。
HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。
HTTP协议的作用原理包括四个步骤:连接,请求,应答,关闭应答。
HTTP协议的作用原理包括四个步骤:(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。
(2) 请求:Web浏览器通过socket向Web服务器提交请求。
HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。
GET命令的格式为:GET 路径/文件名HTTP/1.0 。
其中文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。
(3) 应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。
Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
例:假设客户机与:8080/mydir/index.html建立了连接,就会发送GET命令:GET /mydir/index.html HTTP/1.0。
主机名为/ 的Web服务器从它的文档空间中搜索子目录mydir的文件index.html。
如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。
为了告知Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。
(4)关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
2.2 Java开发语言相关知识与技术Java主要技术有:多线程,I/O流操作,网络编程。
2.2.1 java中的多线程及实现:Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。
下面是一个创建启动一个线程的语句:Thread thread1=new Thread(); file://声明一个对象实例,即创建一个线程;Thread1.run(); file://用Thread类中的run()方法启动线程;从这个例子,我们可以通过Thread()构造方法创建一个线程,并启动该线程。
事实上,启动线程,也就是启动线程的run()方法,而Thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。
要使线程实现预定功能,必须定义自己的run()方法。
Java中通常有两种方式定义run()方法:通过定义一个Thread类的子类,在该子类中重写run()方法。
Thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线程体run()方法,启动线程就启动了子类中重写的run()方法。
通过Runnable接口,在该接口中定义run()方法的接口。
所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。
线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。
线程状态:1)New当线程对象被创建时,处于该状态。
2)Runnable:就绪状态,线程满足运行的所有条件但没有正在运行的线程位于该状态,有以下几种情况:a.处于New状态的线程执行start()。
b.处于Running状态的线程失去CPU。
c.处于Otherwise Block状态的线程阻塞解除。
d.处于Lock Block状态的线程阻塞解除。
3)Running:运行状态处于运行状态的线程可能发生以下几种情况:a.线程运行结束,进入Dead状态。
b.CPU被分配给其它线程,进入Runnable状态。
c.满足Otherwise Block的条件,进入Otherwise Block状态。
d.由于锁的原因无法执行,进入Lock Block状态。
e.由于等待的原因无法执行,进入Wait Block状态。
4)Dead:死亡状态线程运行结束,对于主线程main()结束,对于普通用户线程run()结束。
5)Otherwise Block:阻塞状态,阻塞解除后进入Runnable状态a.调用sleep(),阻塞解除条件为阻塞时间满。
b.调用join(),阻塞解除条件为调用join()的线程执行结束。
注意:线程进入该状态不会释放锁。
6)Lock Block:锁阻塞状态,阻塞解除后进入Runnable状态由于无法获得需要的锁而阻塞地线程进入该状态,阻塞解除条件为获得所需的锁。
7)Wait Block:等待阻塞状态,阻塞解除后进入Lock Block状态由于某个资源的原因必须进行等待,则进入该状态。
阻塞解除条件为其它线程调用该资源的notify()或notifyAll()。
下面一个例子实践了如何通过上述两种方法创建线程并启动它们:// 通过Thread类的子类创建的线程;class thread1 extends Thread{ file://自定义线程的run()方法;public void run(){System.out.println("Thread1 is running…");}}file://通过Runnable接口创建的另外一个线程;class thread2 implements Runnable{ file://自定义线程的run()方法;public void run(){System.out.println("Thread2 is running…");}}file://程序的主类'class Multi_Thread file://声明主类;{plubic static void mail(String args[]) file://声明主方法;{thread1 threadone=new thread1(); file://用Thread类的子类创建线程;Thread threadtwo=new Thread(new thread2()); file://用Runnable接口类的对象创建线程;threadone.start(); threadtwo.start(); file://strat()方法启动线程;}}运行该程序就可以看出,线程threadone和threadtwo交替占用CPU,处于并行运行状态。