简单Web服务器设计与实现课程设计_第1页
简单Web服务器设计与实现课程设计_第2页
简单Web服务器设计与实现课程设计_第3页
简单Web服务器设计与实现课程设计_第4页
简单Web服务器设计与实现课程设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 网站设计与开发专 业 班 级 学 号 学生姓名 指导老师 实习时间 目录1 Web服务器的工作原理- 3 -1.1 HTTP协议的作用原理- 3 -1.2 Java开发语言相关知识与技术- 3 -1.2.1 java中的多线程及实现:- 3 -1.2.2 IO字节流操作- 5 -1.2.3 网络架构:- 7 -2 开发环境及套字接编程- 7 -2.1 Web服务器的开发环境- 7 -2.2 Web服务器的套接字编程- 8 -3.2.1 ServerSocket类- 8 -3 WEB服务器的设计与实现- 8 -3.1 Web服务器的程序设计流程- 8 -3.2 用Java实现Web服务器的主要

2、设计步骤及程序- 9 -4 测试运行- 10 -4.1 调试运行- 10 -5 设计小结- 12 -6 参考文献- 13 -源代码- 13 -1 Web服务器的工作原理1.1 HTTP协议的作用原理WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:

3、连接,请求,应答,关闭应答。 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服务器接到后,进行事务处理,处理结

4、果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。 (4) 关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。 1.2 Java开发语言相关知识与技术Java主要技术有:多线程,I/O流操作,网络编程。1.2.1 java中的多线程及实现:Java是面向对象的程序语言,用Java进行程序设计就是设计和使用类,Java为我们提供了线程类Thread来创建线程,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。下面是一个创建启动一个线程的语句: Thread thread1=

5、new Thread(); file:/声明一个对象实例,即创建一个线程; Thread1.run(); file:/用Thread类中的run()方法启动线程; 从这个例子,我们可以通过Thread()构造方法创建一个线程,并启动该线程。事实上,启动线程,也就是启动线程的run()方法,而Thread类中的run()方法没有任何操作语句,所以这个线程没有任何操作。要使线程实现预定功能,必须定义自己的run()方法。Java中通常有两种方式定义run()方法: 通过定义一个Thread类的子类,在该子类中重写run()方法。Thread子类的实例对象就是一个线程,显然,该线程有我们自己设计的线

6、程体run()方法,启动线程就启动了子类中重写的run()方法。 通过Runnable接口,在该接口中定义run()方法的接口。所谓接口跟类非常类似,主要用来实现特殊功能,如复杂关系的多重继承功能。线程被实际创建后处于待命状态,激活(启动)线程就是启动线程的run()方法,这是通过调用线程的start()方法来实现的。 下面一个例子实践了如何通过上述两种方法创建线程并启动它们: / 通过Thread类的子类创建的线程; class thread1 extends Thread file:/自定义线程的run()方法; public void run() System.out.println(&

7、quot;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 threadon

8、e=new thread1(); file:/用Thread类的子类创建线程; Thread threadtwo=new Thread(new thread2(); file:/用Runnable接口类的对象创建线程; threadone.start(); threadtwo.start(); file:/strat()方法启动线程; 运行该程序就可以看出,线程threadone和threadtwo交替占用CPU,处于并行运行状态。可以看出,启动线程的run()方法是通过调用线程的start()方法来实现的(见上例中主类),调用start()方法启动线程的run()方法不同于一般的调用方法,调

9、用一般方法时,必须等到一般方法执行完毕才能够返回start()方法,而启动线程的run()方法后,start()告诉系统该线程准备就绪可以启动run()方法后,就返回start()方法执行调用start()方法语句下面的语句,这时run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。1.2.2 IO字节流操作1)Java中使用流的方式处理数据,基本的处理类为InputStream(字节读入流)和OutputStream(字节输出流)。2)可以使用各种过滤流对流数据进行过滤,实现各种附加功能。3)对字节流进行转换和包装可以获得字符流,字符流的基本处理流为Reader(字符

10、读入流)和Writer(字符输出流)。a.字节流:InputStream:int read()读入流中的一个字节并返回,数据存放在int的低8位中;int read(byte)读入流中的若干个字节,存放在byte中,返回读入字节的数量;int read(byte,int,int)读入流中的若干个字节,存放在byte中从第一个int参数开始(索引),最大长度为第二个int参数的区间内。OutputStream:flush()将输出缓冲区中的信息写到真正的输出设备。调用方法: 输出缓冲区满:自动调用; 调用close()时先调用flush():自动调用; 手动调用flush()最常见的情况是产生异

11、常时,虽然在finally中会对流执行close(),但在异常条件下,close()能保证对流的关闭,但在调用flush()时会有漏洞。b.字符流:优点:操作文本数据时比较直观,读入和写出都以char为基本单位。缺点:底层依然以字节流方式操作,所以在任何情况下都必须有转换的过程,效率相对较低。操作二进制数据时会存在编码问题,一般不使用字符流操作二进制数据。InputStreamReader:将字节读入流转为字符读入流。InputStreamReader(InputStream):使用默认字符集(取决的JVM)将InpustStream转为InputStreamReader。InputStrea

12、mReader(InputStream, String):使用String指定的字符集将InputStream转为InputStreamReader。OutputStreamWriter:将字符输出流转为字节输出流。OutputStreamWriter(OutputStream):使用默认字符集(取决于JVM)将OutputStreamWriter转为OutputStream。OutputStreamWriter(OutputStream, String):使用String指定的字符集将OutputStreamWriter转为OutputStream。BufferedReader:提供缓冲;r

13、eadLine()。BufferedWriter:提供缓冲。PrintWriter:提供缓冲;print()、println()等方法。注意:在开发中,一般使用BufferedReader和PrintWriter结合使用完成对字符流的过滤。1.2.3 网络架构:1)C/S网络架构客户端/服务器架构,通常情况下,数据存储在服务器端,客户端和服务器端都有一个独立的应用程序,可以进行独立的操作,通过网络进行数据传输。2)B/S网络架构浏览器/服务器架构,在服务器端完成几乎所有的功能(包括数据存储),客户端的浏览器只完成和服务器交互和显示服务器传输的信息的功能。IP:网络通信使用IP地址识别Inter

14、net上的计算机,使用端口号标识服务器上的进程,也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互信息。;Port的有效范围是065535,其中,0-1023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80),除非需要访问这些特定服务,否则,就应该使用1024-65535这些端口中的某一个进行通信,以避免发生端口冲突。TCP/IP协议的实现:a.ServerSocket类:服务器端使用,用于监听客户端的请求。b.Socket类:服务器端和客户端使用,用于完成具体通信的所有功能。UDP/IP协议的实现:a.DatagramSock

15、et类:服务器端和客户端使用,用于实现通信的基本功能。b.DatagramPacket类:服务器端和客户端使用,用于封装通信的内容信息。2 开发环境及套字接编程2.1 Web服务器的开发环境 该课程设计是基于Java编程语言的设计的Web服务器,开发环境是Eclipse软件和Java Swing。(1)MyEclipse简介 MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发。MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错。(2) Java Swing概述

16、Swing是不对等基于GUI工具箱的正式名字,它是Java基础类库的一部分。完整的JFC十分庞大,其中包含的内容远远大于Swing GUI工具箱。JFC特性不仅仅包含了Swing组件,而且还包含了一个可访问的API、一个2D API和一个可拖拽的API。Swing拥有一个丰富、便捷的用户界面元素集合,对底层平台依赖的很少,因此与平台相关的bug很少。Swing给予不同平台的用户一致的感官效果5。2.2 Web服务器的套接字编程Java提供了一个 ServerSocket类,程序员可以很方便地用它编写服务器程序。服务器套接字的基本功能类似于坐在电话机旁边等待呼叫到来。从技术上讲, ServerS

17、ocket运行在服务器上并监听到来的 TCP连接。 每个ServerSocket都在服务器上的指定端口监听。当远程主机上的客户Socket试图与指定端口建立连接时,服务器被激活,判定客户程序与服务器的连接,并打开两个主机之间固有的Socket。一旦与服务器套接字建立了连接,则服务器就可以使用固有的Socket对象向客户机发送数据。数据总是通过固有的套接字传递。3.2.1 ServerSocket类 ServerSocket类包含了用 Java编写服务器程序的所有内容。它包括创建新 ServerSocket对象的构造器、在指定端口监听连接的方法,以及连接建立后可以发送和接收数据时返回 Socke

18、t对象的方法。此外,它还有设置不同选项以及各种各样常用的方法,例如 toString()方法。 3 WEB服务器的设计与实现3.1 Web服务器的程序设计流程根据上述HTTP协议的作用原理,实现GET请求的Web服务器程序的方法如下: (1) 创建ServerSocket类对象,监听端口8080。这是为了区别于HTTP的标准TCP/IP端口80而取的; (2) 等待、接受客户机连接到端口8080,得到与客户机连接的socket; (3) 创建与socket字相关联的输入流instream和输出流outstream; (4) 从与socket关联的输入流instream中读取一行客户机提交的请求

19、信息,请求信息的格式为: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-1 Web服务器的程序设计流程3.2 用Java实现Web服务器的主要设计步骤及程

20、序1.点击开始,打开MyEclipse软件,在左框内建立Java工程,在工程中分别建立相应的包和类,如图3-2所示。图4-2在工程中分别建立相应的包和类2. 设计主函数程序在Java工程中建立包webserver和类HttpServer、Request、Response。4 测试运行4.1 调试运行 为了确保上述程序的正确性,进行调试运行,在工程文件的WebRoot中建立html文件,在index.html文件中输入“欢迎使用#服务器已经成功连接班级:物联网131学号:1#姓名:#”如下图4-1所示。图4-1在index.html文件中如图字样 右击运行HttpServer服务器结果显示为如图

21、4-2所示:图4-2 运行应用程序的结果 然后打开浏览器,输入网址http:/localhost:8080/ ,即 Web服务器把该文件内容传送给了相应的Web浏览器。刷新得到如图4-3所示:图4-3 把文件内容传送给相应的Web浏览器 应用程序窗口显示,等待连接,/请求连接,服务器处理连接,用户请求:/index.html,开始发送用户请求资源,发送完毕,连接关闭。内容如图4-4所示: 4-4 运行应用程序后结果5 设计小结课程设计让我初步了解了Web服务器的设计和工作原理,又重新熟悉了Java语言和熟练了MyEclipse编程软件的使用,对我的网络编程有了很大的提高。设计

22、起初我遇到了一些问题,后来通过上网,查阅书籍等方式解决了,对一些问题有了初步了解。当然在老师和同学的热心帮助下,我慢慢解开了课程设计中遇到的一些问题,慢慢揭开这门设计的神秘面纱,最终完成了我的课程设计。这次课程设计不仅考察了我们对课堂学的专业知识的理解程度,也锻炼了我们的动手能力和解决问题的能力。总的来说,我觉得这次课程设计使我自身的知识丰富了不少,但是我也发现了由于,软件操作不够熟练,不能灵活运用。使我了解要先学好理论知识才能很好的与实践相结合,才能熟练的运用到生活中6 参考文献1 吴伟敏.网站设计与Web应用开发技术(第二版).清华大学出版社,2015.52 耿祥义、张跃平.Java 2实

23、用教程(第四版).清华大学出版社,2012.83孙卫琴. Java网络编程精解. 北京:电子工业出版社,2007.34吴凤祥.用Java实现一个Socket通信模型.现代电子技术,2001.7.205 耿祥义、张跃平.Java课程设计(第二版).清华大学出版社.2008.11源代码 HttpServer.java:package webserver;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Properties;import java.i

24、o.IOException;import java.util.Enumeration;import .ServerSocket;import .Socket;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;public class HttpServer private int iPort = 8080; /default port public static String Basic_Root=System.getProperty("user.dir"); p

25、ublic static String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot" public static int count=0; public HttpServer() System.out.println("欢迎使用Web服务器,本服务器只支持静态网页。"); System.out.println("检查配置文件及网页文件夹."); getConfig(); start(); public static vo

26、id main(String args) HttpServer httpserver = new HttpServer(); private void getConfig() File fileCon=new File(Basic_Root,"config.ini"); File fileDir=new File(WEB_ROOT); File fileWeb=new File(WEB_ROOT,"index.htm"); if(!fileCon.exists() System.out.println("配置文件Config.ini损坏,重建中

27、."); 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() reBuildW

28、eb(fileWeb); Properties pps = new Properties(); try pps.load(new FileInputStream("config.ini"); Enumeration enumer = pertyNames(); String strKey = (String) enumer.nextElement(); String strValue = pps.getProperty(strKey); if (strValue.equals("") != true) WEB_ROOT = strValue

29、; 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

30、.ini文件重新设定以上配置"); System.out.println("启动检查完成,服务器初始化中."); catch (IOException ex) ex.printStackTrace(); public void start() System.out.println("Web 服务器启动中."); ServerSocket serverSocket; try serverSocket = new ServerSocket(iPort); System.out.println("Web 启动完成!"); Syst

31、em.out.println("您现在可以在浏览器中访问http:/localhost:8080/,以测试服务器是否运行"); while (true) Socket socket = null; InputStream input = null; OutputStream output = null; System.out.println("等待连接."); socket = serverSocket.accept(); System.out.println(socket.getInetAddress().toString()+"请求连接&q

32、uot;); input=socket.getInputStream(); output=socket.getOutputStream(); System.out.println("服务器开始处理第"+(+count)+"次连接"); /开始处理并分析请求信息 Request request=new Request(input); request.parse(); /开始发送请求资源 Response response=new Response(output); response.setRequest(request); response.sendSta

33、ticResource(); /关系连接 socket.close(); System.out.println("连接已关闭!"); catch(Exception ex) ex.printStackTrace(); System.out.println("3"); /continue; private void reBuildConfig(File file) try file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); PrintStream sp=new Pri

34、ntStream(fos); sp.println("WEB_ROOT="); sp.println("PORT="); sp.close(); System.out.println("配置文件Config.ini创建成功,您可以修改WEB_ROOT的值改变网页文件的存放路径,修改PORT的值改变访问端口!"); catch (IOException ex) ex.printStackTrace(); System.out.println("重建配置文件Config.ini失败"); System.out.prin

35、tln("服务器将使用默认配置."); private void reBuildWeb(File file) try file.createNewFile(); FileOutputStream fos=new FileOutputStream(file); PrintStream sp=new PrintStream(fos); sp.println("<html>"); sp.println("<head>"); sp.println("<title>简单Web服务器</titl

36、e>"); sp.println("</head>"); sp.println("<body>"); sp.println("<div align="+"center"+">服务器已经成功运行 </div>"); sp.println("</body>"); sp.println("</html>"); sp.close(); catch (Exception ex)

37、ex.printStackTrace(); Request.java:package webserver;import java.io.InputStream;public class Request public Request() private InputStream input; private String uri; public Request(InputStream input) this.input = input; public void parse()/取得请求信息 StringBuffer request = new StringBuffer(2048); int i;

38、byte buffer = new byte2048; try i = input.read(buffer); catch (Exception ex) ex.printStackTrace(); i = -1; for (int j = 0; j < i; j+) request.append(char) bufferj); System.out.println(request.toString(); uri = parseUri(request.toString(); System.out.println("用户请求:"+this.getUri(); privat

39、e String parseUri(String requestString)/分析请求信息,并返回 int index1, index2; index1 = requestString.indexOf(" "); if (index1 != -1) index2 = requestString.indexOf(" ", index1 + 1); if (index2 > index1) return requestString.substring(index1 + 1, index2); return null; public String getUri() if (pareTo("/")=0) uri=&quo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论