首页 简单Web服务器设计与实现课程设计

简单Web服务器设计与实现课程设计

举报
开通vip

简单Web服务器设计与实现课程设计PAGE\*MERGEFORMAT-22-琼州学院电子信息工程学院课程设计报告课程名称:计算机网络设计题目:简单web服务器设计与实现专业:软件工程学生姓名:王永浩(11241056)、宋雨(11241060)夏成鹏(11241066)、黄兵周(11241007)指导教师:陈德祥日期:2014年4月6日指导教师评语:最终成绩:指导教师签名:年月日成绩评定项目权重成绩1、设计过程中的学习态度0.22、课程设计的质量及答辩0.53、设计报告书规范程度0.34、总成绩...

简单Web服务器设计与实现课程设计
PAGE\*MERGEFORMAT-22-琼州学院电子信息工程学院课程 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 课程名称:计算机网络设计 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目:简单web服务器设计与实现专业:软件工程学生姓名:王永浩(11241056)、宋雨(11241060)夏成鹏(11241066)、黄兵周(11241007)指导教师:陈德祥日期:2014年4月6日指导教师评语:最终成绩:指导教师签名:年月日成绩评定项目权重成绩1、设计过程中的学习态度0.22、课程设计的质量及答辩0.53、设计报告书 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 程度0.34、总成绩目录TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc385940533"摘要PAGEREF_Toc385940533\h-2-HYPERLINK\l"_Toc385940534"1前言PAGEREF_Toc385940534\h-2-HYPERLINK\l"_Toc385940535"1.1课程设计前准备PAGEREF_Toc385940535\h-2-HYPERLINK\l"_Toc385940536"1.2课程设计的内容PAGEREF_Toc385940536\h-3-HYPERLINK\l"_Toc385940537"1.3课程设计要求PAGEREF_Toc385940537\h-3-HYPERLINK\l"_Toc385940538"1.4课程设计平台PAGEREF_Toc385940538\h-3-HYPERLINK\l"_Toc385940539"2Web服务器的工作原理PAGEREF_Toc385940539\h-4-HYPERLINK\l"_Toc385940540"2.1HTTP 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的作用原理PAGEREF_Toc385940540\h-4-HYPERLINK\l"_Toc385940541"2.2Java开发语言相关知识与技术PAGEREF_Toc385940541\h-5-HYPERLINK\l"_Toc385940542"2.2.1java中的多线程及实现:PAGEREF_Toc385940542\h-5-HYPERLINK\l"_Toc385940543"2.2.2I/O字节流操作PAGEREF_Toc385940543\h-7-HYPERLINK\l"_Toc385940544"2.2.3网络架构:PAGEREF_Toc385940544\h-9-HYPERLINK\l"_Toc385940545"3开发环境及套字接编程PAGEREF_Toc385940545\h-10-HYPERLINK\l"_Toc385940546"3.1Web服务器的开发环境PAGEREF_Toc385940546\h-10-HYPERLINK\l"_Toc385940547"3.2Web服务器的套接字编程PAGEREF_Toc385940547\h-11-HYPERLINK\l"_Toc385940548"3.2.1ServerSocket类PAGEREF_Toc385940548\h-11-HYPERLINK\l"_Toc385940549"4WEB服务器的设计与实现PAGEREF_Toc385940549\h-12-HYPERLINK\l"_Toc385940550"4.1Web服务器的程序设计流程PAGEREF_Toc385940550\h-12-HYPERLINK\l"_Toc385940551"4.2用Java实现Web服务器的主要设计步骤及程序PAGEREF_Toc385940551\h-13-HYPERLINK\l"_Toc385940552"5测试运行PAGEREF_Toc385940552\h-20-HYPERLINK\l"_Toc385940553"5.1调试运行PAGEREF_Toc385940553\h-20-HYPERLINK\l"_Toc385940554"结束语PAGEREF_Toc385940554\h-21-HYPERLINK\l"_Toc385940555"参考文献PAGEREF_Toc385940555\h-22-摘要WWW的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤:连接,请求,应答,关闭应答。在课程设计中,系统开发平台为Win7,程序设计语言采用Java,程序运行平台为Eclipse。在程序设计中,采用了结构化与面向对象两种解决问题的方法。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以应用在商业中解决实际问题。关键词:Java;HTTP;Web服务器1前言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服务器的设计与实现,要求能够通过HTTPGET命令获得一个简单的HTML文件;(4)运行该服务器,并编写一个简单的HTML文件完成测试。1.3课程设计要求(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。1.4课程设计平台Windows7系统、Eclipse软件平台。2Web服务器的工作原理2.1HTTP协议的作用原理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浏览器上显示出所请求的页面。例:假设客户机与www.mycompany.com:8080/mydir/index.html建立了连接,就会发送GET命令:GET/mydir/index.htmlHTTP/1.0。主机名为http://www.mycompany.com/的Web服务器从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。2.2Java开发语言相关知识与技术Java主要技术有:多线程,I/O流操作,网络编程。2.2.1java中的多线程及实现:Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。下面是一个创建启动一个线程的语句:Threadthread1=newThread();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.处于OtherwiseBlock状态的线程阻塞解除。d.处于LockBlock状态的线程阻塞解除。3)Running:运行状态处于运行状态的线程可能发生以下几种情况:a.线程运行结束,进入Dead状态。b.CPU被分配给其它线程,进入Runnable状态。c.满足OtherwiseBlock的条件,进入OtherwiseBlock状态。d.由于锁的原因无法执行,进入LockBlock状态。e.由于等待的原因无法执行,进入WaitBlock状态。4)Dead:死亡状态线程运行结束,对于主线程main()结束,对于普通用户线程run()结束。5)OtherwiseBlock:阻塞状态,阻塞解除后进入Runnable状态a.调用sleep(),阻塞解除条件为阻塞时间满。b.调用join(),阻塞解除条件为调用join()的线程执行结束。注意:线程进入该状态不会释放锁。6)LockBlock:锁阻塞状态,阻塞解除后进入Runnable状态由于无法获得需要的锁而阻塞地线程进入该状态,阻塞解除条件为获得所需的锁。7)WaitBlock:等待阻塞状态,阻塞解除后进入LockBlock状态由于某个资源的原因必须进行等待,则进入该状态。阻塞解除条件为其它线程调用该资源的notify()或notifyAll()。下面一个例子实践了如何通过上述两种方法创建线程并启动它们:  //通过Thread类的子类创建的线程;   classthread1extendsThread    {file://自定义线程的run()方法;     publicvoidrun()      {       System.out.println("Thread1isrunning…");      }     }   file://通过Runnable接口创建的另外一个线程;  classthread2implementsRunnable   {file://自定义线程的run()方法;    publicvoidrun()    {     System.out.println("Thread2isrunning…");    }   }   file://程序的主类'   classMulti_Threadfile://声明主类;    {     plubicstaticvoidmail(Stringargs[])file://声明主方法;      {       thread1threadone=newthread1();file://用Thread类的子类创建线程;       Threadthreadtwo=newThread(newthread2());file://用Runnable接口类的对象创建线程;       threadone.start();threadtwo.start();file://strat()方法启动线程;      }     }运行该程序就可以看出,线程threadone和threadtwo交替占用CPU,处于并行运行状态。可以看出,启动线程的run()方法是通过调用线程的start()方法来实现的(见上例中主类),调用start()方法启动线程的run()方法不同于一般的调用方法,调用一般方法时,必须等到一般方法执行完毕才能够返回start()方法,而启动线程的run()方法后,start()告诉系统该线程准备就绪可以启动run()方法后,就返回start()方法执行调用start()方法语句下面的语句,这时run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。2.2.2I/O字节流操作1)Java中使用流的方式处理数据,基本的处理类为InputStream(字节读入流)和OutputStream(字节输出流)。2)可以使用各种过滤流对流数据进行过滤,实现各种附加功能。3)对字节流进行转换和包装可以获得字符流,字符流的基本处理流为Reader(字符读入流)和Writer(字符输出流)。a.字节流:InputStream:intread()读入流中的一个字节并返回,数据存放在int的低8位中;intread(byte[])读入流中的若干个字节,存放在byte[]中,返回读入字节的数量;intread(byte[],int,int)读入流中的若干个字节,存放在byte[]中从第一个int参数开始(索引),最大长度为第二个int参数的区间内。OutputStream:flush()将输出缓冲区中的信息写到真正的输出设备。调用方法:①输出缓冲区满:自动调用;②调用close()时先调用flush():自动调用;③手动调用flush()最常见的情况是产生异常时,虽然在finally中会对流执行close(),但在异常条件下,close()能保证对流的关闭,但在调用flush()时会有漏洞。b.字符流:优点:操作文本数据时比较直观,读入和写出都以char为基本单位。缺点:底层依然以字节流方式操作,所以在任何情况下都必须有转换的过程,效率相对较低。操作二进制数据时会存在编码问题,一般不使用字符流操作二进制数据。InputStreamReader:将字节读入流转为字符读入流。InputStreamReader(InputStream):使用默认字符集(取决的JVM)将InpustStream转为InputStreamReader。InputStreamReader(InputStream,String):使用String指定的字符集将InputStream转为InputStreamReader。OutputStreamWriter:将字符输出流转为字节输出流。OutputStreamWriter(OutputStream):使用默认字符集(取决于JVM)将OutputStreamWriter转为OutputStream。OutputStreamWriter(OutputStream,String):使用String指定的字符集将OutputStreamWriter转为OutputStream。BufferedReader:提供缓冲;readLine()。BufferedWriter:提供缓冲。PrintWriter:提供缓冲;print()、println()等方法。注意:在开发中,一般使用BufferedReader和PrintWriter结合使用完成对字符流的过滤。2.2.3网络架构:1)C/S网络架构客户端/服务器架构,通常情况下,数据存储在服务器端,客户端和服务器端都有一个独立的应用程序,可以进行独立的操作,通过网络进行数据传输。常用的传输协议包括:TCP/IP:基于连接的协议优点:由于是有连接的传输,对于数据的准确性是有保证的。缺点:系统资源占用较多。UDP/IP:无连接的协议(数据报)优点:系统资源占用少。缺点:无法保证传输的准确性。用途:a.对于数据少量丢失可以接受的应用。b.存在足够数据冗余的应用。2)B/S网络架构浏览器/服务器架构,在服务器端完成几乎所有的功能(包括数据存储),客户端的浏览器只完成和服务器交互和显示服务器传输的信息的功能。常用的传输协议包括:http:超文本传输协议。https:支持多种加密操作的超文本传输协议。优点:客户端不需要安装任何附加软件,同时整个应用的升级也相对简单。IP:通过IPAddress和Port(端口)定位具体的应用;Port的有效范围是0~65535,通常在开发应用时应避免使用1000以下的端口,1000以下有很多端口被常用应用占用。IPAddress在JDK5.0中支持4位或6位两种方式,现在4位的占据主导地位,但将来会逐渐过渡到6位IP地址的模式。TCP/IP协议的实现:a.ServerSocket类:服务器端使用,用于监听客户端的请求。b.Socket类:服务器端和客户端使用,用于完成具体通信的所有功能。UDP/IP协议的实现:a.DatagramSocket类:服务器端和客户端使用,用于实现通信的基本功能。b.DatagramPacket类:服务器端和客户端使用,用于封装通信的内容信息。3开发环境及套字接编程3.1Web服务器的开发环境该课程设计是基于Java编程语言的设计的Web服务器,开发环境是Eclipse软件和JavaSwing。(1)Eclipse简介Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件和组件构建开发环境。Eclipse附带了一个标准的插件集,包括Java开发工具。Eclipse采用的技术是IBM公司开发的(SWT),这是一种基于Java的窗口组件,类似Java本身提供的AWT和Swing窗口组件,Eclipse的插件机制是轻型软件组件化架构。在富客户机平台上,Eclipse使用插件来提供所有的附加功能[4]。JavaSwing概述Swing是不对等基于GUI工具箱的正式名字,它是Java基础类库的一部分。完整的JFC十分庞大,其中包含的内容远远大于SwingGUI工具箱。JFC特性不仅仅包含了Swing组件,而且还包含了一个可访问的API、一个2DAPI和一个可拖拽的API。Swing拥有一个丰富、便捷的用户界面元素集合,对底层平台依赖的很少,因此与平台相关的bug很少。Swing给予不同平台的用户一致的感官效果[5]。3.2Web服务器的套接字编程Java提供了一个ServerSocket类,程序员可以很方便地用它编写服务器程序。服务器套接字的基本功能类似于坐在电话机旁边等待呼叫到来。从技术上讲,ServerSocket运行在服务器上并监听到来的TCP连接。每个ServerSocket都在服务器上的指定端口监听。当远程主机上的客户Socket试图与指定端口建立连接时,服务器被激活,判定客户程序与服务器的连接,并打开两个主机之间固有的Socket。一旦与服务器套接字建立了连接,则服务器就可以使用固有的Socket对象向客户机发送数据。数据总是通过固有的套接字传递。3.2.1ServerSocket类ServerSocket类包含了用Java编写服务器程序的所有内容。它包括创建新ServerSocket对象的构造器、在指定端口监听连接的方法,以及连接建立后可以发送和接收数据时返回Socket对象的方法。此外,它还有设置不同选项以及各种各样常用的方法,例如toString()方法。服务器的基本生命期是:1.利用ServerSocket()构造器在指定端口创建一个新的ServerSocket;2.ServerSocket利用它的accept()方法在指定端口监听到来的连接。accept()方法一直处于阻塞状态,直到有客户机试图建立连接。这时accept()方法返回连接客户机何服务器的Socket;3.调用getInputStream()方法、getOutputStream()方法或者两者都调用来得到与客户机通信的输入流和输出流,具体调用哪一个方法还是两者都调用与具体服务器的类型有关;4.服务器和客户机根据双方都承认的协议进行交互,直到关闭连接时为止;5.服务器、客户机或两者均关闭连接;6.服务器返回步骤2,等待下一个连接到来。如果在4步花费的时间很长或时间无限期,则wu-ftpd这样的传统Unix服务器会创建一个新的进程来处理每个连接,从而使服务器在同一时刻可以为多个客户机提供服务。4WEB服务器的设计与实现4.1Web服务器的程序设计流程根据上述HTTP协议的作用原理,实现GET请求的Web服务器程序的方法如下:(1)创建ServerSocket类对象,监听端口8080。这是为了区别于HTTP的标准TCP/IP端口80而取的;(2)等待、接受客户机连接到端口8080,得到与客户机连接的socket;(3)创建与socket字相关联的输入流instream和输出流outstream;(4)从与socket关联的输入流instream中读取一行客户机提交的请求信息,请求信息的格式为:GET路径/文件名HTTP/1.0(5)从请求信息中获取请求类型。如果请求类型是GET,则从请求信息中获取所访问的HTML文件名。没有HTML文件名时,则以index.html作为文件名;(6)如果HTML文件存在,则打开HTML文件,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,然后关闭文件。否则发送错误信息给Web浏览器;(7)关闭与相应Web浏览器连接的socket字。可以总结出Web服务器的设计流程并作出其设计流程图,如图4-1所示。图4-1Web服务器的程序设计流程4.2用Java实现Web服务器的主要设计步骤及程序1.点击开始,打开eclipse软件,在左框内建立Java工程,在工程中分别建立相应的包和类,如图4-2所示。图4-2在工程中分别建立相应的包和类2.设计主函数程序在Java工程中建立包webserver和类HttpServer、Request、Response,在对应框中输入以下程序代码:-------------------------HttpServer.java-------------------------------packagewebserver;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.Properties;importjava.io.IOException;importjava.util.Enumeration;importjava.net.ServerSocket;importjava.net.Socket;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PrintStream;publicclassHttpServer{privateintiPort=8080;//defaultportpublicstaticStringBasic_Root=System.getProperty("user.dir");publicstaticStringWEB_ROOT=System.getProperty("user.dir")+File.separator+"webroot";publicstaticintcount=0;publicHttpServer(){System.out.println("欢迎使用Web服务器,本服务器只支持静态网页。");System.out.println("检查配置文件及网页文件夹...");getConfig();start();}publicstaticvoidmain(String[]args){HttpServerhttpserver=newHttpServer();}privatevoidgetConfig(){FilefileCon=newFile(Basic_Root,"config.ini");FilefileDir=newFile(WEB_ROOT);FilefileWeb=newFile(WEB_ROOT,"index.htm");if(!fileCon.exists()){System.out.println("配置文件Config.ini损坏,重建中...");reBuildConfig(fileCon);}if(!fileDir.exists()){System.out.println("网页存放文件夹不存在,重建中...");fileDir.mkdir();System.out.print("完成!请在");System.out.println(WEB_ROOT+"中放置网页文件...");System.out.println("Web服务器将重新初始化...");getConfig();}if(!fileWeb.exists()){reBuildWeb(fileWeb);}Propertiespps=newProperties();try{pps.load(newFileInputStream("config.ini"));Enumerationenumer=pps.propertyNames();StringstrKey=(String)enumer.nextElement();StringstrValue=pps.getProperty(strKey);if(strValue.equals("")!=true){WEB_ROOT=strValue;}System.out.println("网页文件的存放路径为:"+WEB_ROOT);strKey=(String)enumer.nextElement();strValue=pps.getProperty(strKey);if(strValue.equals("")!=true){iPort=Integer.parseInt(strValue);}System.out.println("Web服务器访问端口为:"+iPort);System.out.println("您可以修改Config.ini文件重新设定以上配置");System.out.println("启动检查完成,服务器初始化中...");}catch(IOExceptionex){ex.printStackTrace();}}publicvoidstart(){System.out.println("Web服务器启动中...");ServerSocketserverSocket;try{serverSocket=newServerSocket(iPort);System.out.println("Web启动完成!");System.out.println("您现在可以在浏览器中访问http://localhost:8080/,以测试服务器是否运行");while(true){Socketsocket=null;InputStreaminput=null;OutputStreamoutput=null;System.out.println("等待连接...");socket=serverSocket.accept();System.out.println(socket.getInetAddress().toString()+"请求连接");input=socket.getInputStream();output=socket.getOutputStream();System.out.println("服务器开始处理第"+(++count)+"次连接");//开始处理并分析请求信息Requestrequest=newRequest(input);request.parse();//开始发送请求资源Responseresponse=newResponse(output);response.setRequest(request);response.sendStaticResource();//关系连接socket.close();System.out.println("连接已关闭!");}}catch(Exceptionex){ex.printStackTrace();System.out.println("3");//continue;}}privatevoidreBuildConfig(Filefile){try{file.createNewFile();FileOutputStreamfos=newFileOutputStream(file);PrintStreamsp=newPrintStream(fos);sp.println("WEB_ROOT=");sp.println("PORT=");sp.close();System.out.println("配置文件Config.ini创建成功,您可以修改WEB_ROOT的值改变网页文件的存放路径,修改PORT的值改变访问端口!");}catch(IOExceptionex){ex.printStackTrace();System.out.println("重建配置文件Config.ini失败");System.out.println("服务器将使用默认配置...");}}privatevoidreBuildWeb(Filefile){try{file.createNewFile();FileOutputStreamfos=newFileOutputStream(file);PrintStreamsp=newPrintStream(fos);sp.println("");sp.println("");sp.println("简单Web服务器");sp.println("");sp.println("");sp.println("服务器已经成功运行
");sp.println("");sp.println("");sp.close();}catch(Exceptionex){ex.printStackTrace();}}}-----------------------Request.java------------------------------------packagewebserver;importjava.io.InputStream;publicclassRequest{publicRequest(){}privateInputStreaminput;privateStringuri;publicRequest(InputStreaminput){this.input=input;}publicvoidparse()//取得请求信息{StringBufferrequest=newStringBuffer(2048);inti;byte[]buffer=newbyte[2048];try{i=input.read(buffer);}catch(Exceptionex){ex.printStackTrace();i=-1;}for(intj=0;jindex1){returnrequestString.substring(index1+1,index2);}}returnnull;}publicStringgetUri(){if(uri.compareTo("/")==0){uri="/index.htm";}if(uri.indexOf(".")==-1){uri+=".htm";}returnuri;}}----------------------------Response.java------------------------------packagewebserver;importjava.io.OutputStream;importjava.io.IOException;importjava.io.FileInputStream;importjava.io.File;publicclassResponse{privatestaticfinalintBUFFER_SIZE=1024;Requestrequest;OutputStreamoutput;publicResponse(OutputStreamoutput){this.output=output;}publicvoidsetRequest(Requestrequest){this.request=request;}publicvoidsendStaticResource()//发送请求资源throwsIOException{byte[]bytes=newbyte[BUFFER_SIZE];FileInputStreamfis=null;try{Filefile=newFile(HttpServer.WEB_ROOT,request.getUri());if(file.exists()){System.out.println("开始发送用户请求资源...");fis=newFileInputStream(file);intch=fis.read(bytes,0,BUFFER_SIZE);while(ch!=-1){output.write(bytes,0,ch);ch=fis.read(bytes,0,BUFFER_SIZE);}System.out.println("发送完毕!");}else{System.out.println("用户请求的资源不存在");StringerrorMessage="HTTP/1.1404FileNotFound\r\n"+"Content-Type:text/html\r\n"+"\r\n"+"FileNotFound";output.write(errorMessage.getBytes());}}catch(Exceptionex){ex.printStackTrace();System.out.println("获取请求资源错误,请检查本地资源设置!");System.exit(1);}if(fis!=null){fis.close();}}}5测试运行5.1调试运行为了确保上述程序的正确性,进行调试运行,在工程文件的webroot中建立html文件,如下图5-1所示。图5-1运行应用程序的结果应用程序窗口显示,等待连接,/127.0.0.1请求连接,服务器处理连接,用户请求:/index.html,开始发送用户请求资源,发送完毕,连接关闭。内容如图5-2所示:图5-2运行应用程序后结果结束语随着网络在人们日常生活中的应用越来越广泛和嵌入式技术在日常生活中的地位日愈凸显。这对我们这些有关网络专业的学生既是一种挑战,也是一个机遇。通过这次课程设计让我初步了解了Web服务器的设计和工作原理,掌握了一些JAVA语言和学会使用Eclipse编程软件,对我的网络编程有了很大的提高。与此同时我还学到了一些专业知识之外的东西。课程设计的过程中,我了解到课程设计不光光是埋头做设计,也是同学之间互相学习,互相交流经验的机会;也是大家向老师提出疑问和解答疑问的机会。我觉得课程设计是一个复习课堂上学到知识的机会,也是一个加强学生动手设计能力的机会。设计起初我遇到了一些问题,后来我通过上网,查阅书籍和请教老师,对一些问题有了初步了解。当然在老师和同学的热心帮助下,我慢慢解开了课程设计中遇到的一些问题,慢慢揭开这门设计的神秘面纱,最终完成了我的课程设计。这次课程设计不仅考察了我们对课堂学的专业知识的理解程度,也锻炼了我们的动手能力,提高了我们独立思考问题,解决问题的能力。总体上看,我觉得这次课程设计使我自身的知识丰富了不少,但是同时也发现了自己在动手和专业知识方面存在的一些问题,例如知识不能融合,不能与实践相结合,软件操作不够熟练,不能灵活运用。使我了解要先学好理论知识才能很好的与实践相结合,才能熟练的运用到生活中参考文献[1]HarveyM.Deitel等著邱仲潘等译.JavaWeb服务高级教程.第一版.机械工业出版社,2003.7[2]王勇.计算机网络课程设计(计算机课程设计与综合实践规划教材).清华大学出版社//Java编程[3]孙卫琴.《Java网络编程精解》.北京:电子工业出版社,2007.3[4]吴凤祥.《用Java实现一个Socket通信模型》.《现代电子技术》,2001.7.20,1~5[5]耿祥义、张跃平.Java2实用教程(第三版).清华大学出版社.2006
本文档为【简单Web服务器设计与实现课程设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载

你可能还喜欢

最新资料
资料动态
专题动态
个人认证用户
旋律
几年的财务工作经验,现认财务主管一职!精通各种财务管理软件
格式:doc
大小:188KB
软件:Word
页数:0
分类:
上传时间:2018-07-02
浏览量:5