web服务器 设计_第1页
web服务器 设计_第2页
web服务器 设计_第3页
web服务器 设计_第4页
web服务器 设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、Web服务器设计I/O接口的实现学生姓名:xx 指导老师:XXX摘 要 Web服务器的实现主要是服务器端接受并响应客户端的请求,本次设计是在eclipse开发平台上使用Java编程技术设计Web服务器。该Web服务器的设计分为两大部分,分别是Web服务器面板的设计与Web服务器I/O接的实现,在本次课程设计中我们首先要建立一个Web服务器的用户面板,使用户能够直观的看到Web服务器的工作,然后实现这个服务器的通信,即实现数据传送。最后通过对这两个模块的设计及其运行,我们通过在Web浏览器中输入Web服务器的socket,能够实现Web服务器与Web浏览器之间的通信。关键字 AWT组件;Swin

2、g组件;Socket套接字;异常处理机制;线程;流1 引 言长期以来,人们只是通过传统的媒体(如电视、报纸、杂志和广播等)获得信息。但随着计算机网络的发展,人们想要获取信息,已不再满足于传统媒体那种单方面传输和获取的方式,而希望有一种主观的选择性,而由于计算机网络的发展,信息的获取变得非常及时、迅速和便捷。 其中,WWW 技术解决了远程信息服务中的文字显示、数据连接以及图像传递的问题,使得 WWW 成为 Internet 上最为流行的信息传播方式。 现在,Web 服务器成为 Internet 上最大的计算机群,Web 文档之多、链接的网络之广,令人难以想象。可以说,Web 为 Internet

3、 的普及迈出了开创性的一步,是近年来 Internet 上取得的最激动人心的成就。1.1课程设计的目的通过本次课程设计,加深对计算机网络方面相关的网络知识的理解,熟悉Java语言编程以及eclipse开发平台的运用。深入理解Web服务器的工作原理,以及如何运用Java语言在eclipse平台上来进行编程设计和实现。掌握运用Java语言进行面板设计、实现网络连接的方法,在学习理解基本理论知识的同时锻炼独立思考解决问题的能力,并且培养综合运用专业及基础知识,理论联系实际,提高自己动手能力。1.2课程设计的要求(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态

4、度,认真的工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。1.3设计平台Eclipse设计平台本次Web服务器的设计是通过Java语言的程序设计,在Eclipse平台上实现的。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。 虽然大多数用户很乐于将 Eclipse 当作 Java IDE

5、 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C+、CO

6、BOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。2 设计原理本次课程设计是要设计一个Web服务器,主要分为两大块,一是图形用户界面的设计,一是I/O接口的实现,即实现Web服务器与客户端(浏览器)之间的通信。本课程设计只简单说明一下图形界面的设计流程,着重于介绍I/O接口的实现这一块。在实现I/O接口(服务器与浏览器的通信)中,我们主要运用了Socket套接字、Java线程、Java异常处理机制、输入输出流的设计原理和方法,下面会着重的一一介绍。2.1图形用户界面设计AWT组件。早期的J

7、DK版本中提供了Java抽象窗口工具集(Abstract Window Toolkit,AWT),其目的是为程序员创建图形用户界面提供支持。AWT组件定义在java.awt包中,包括组件类、组件布局类等。其中:组件(component)是构成图形用户界面的基本成分和核心元素。组件类(Component)是一个抽象类,是AWT组件类层次结构的根类,实际使用的组件都是Component类的子类。Component类提供对组件操作的通用方法,包括设置组件位置、设置组件大小、设置组件字体、响应鼠标或键盘事件、组件重绘等等。Swing组件。Swing组件包含了大部分与AWT对应的组件,而多数的Swing

8、组件相对于AWT组件而言是以“J”开头。Swing组件与AWT组件的用法基本相同,大多数的AWT组件只要在其类名前加J即可转换成Swing组件。Swing组件与AWT组件最大的不同是,Swing组件在实现时不包含任何本地代码,因此Swing组件可以不受硬件平台的限制,而具有更多的功能。由于所有Swing组件均是以AWT的Container类为基础开发的,因此Swing的关键技术还是AWT,Swing库是抽象窗口工具AWT库的扩展,提供了比AWT更多的特性和工具,用于建立更复杂的图形用户界面1。2.2 套接字SocketSocket(套接字)是TCP/IP的编程接口,即利用Socket提供的一组

9、API就可以变成实现TCP/IP协议。网络上计算机任何一个应用程序都可以通过Socket与其他计算机进行通行。Socket是通信端点的一种抽象,它提供了一种发送和接收数据的机制2。Socket所要完成的通信就是基于连接的通信,建立连接所需的程序分别运行在客户端和服务器端,其主要步骤为:(1) 建立连接:首先客户端程序申请连接,而服务器程序监听所有端口,判断是否有客户端程序的服务请求,当客户端程序请求和某个端口连接时,服务器就将Socket连接到该端口上,此时服务器和客户程序之间建立了一个专用的虚拟连接。(2) 数据通信:客户程序可以像Socket写入请求,服务器程序处理请求并把处理结果通过So

10、cket送回。(3) 拆除连接:通信结束,将所建立的虚拟连接拆除。ServerSocket类和Socket类分辨应用于服务器端和客户端的Socket通信,其中,创建了一个ServerSocket对象就创建了一个监听,为了能够随时监听客户端的请求,可以引用ServerSocket对象的accept()方法。而创建一个Socket对象用于与服务器建立连接,使用指定的端口号使得服务器在捕获到客户端的请求时,根据端口号来完成指定的服务,Socket对象创建成功后,就可以在客户机与服务器之间建立一个连接,并通过这个连接在两个端口之间传送数据。2.3 Java异常处理机制异常是指应用程序在运行过程中发生的

11、不正常情况,或发生错误。任何用计算机程序设计语言编写的程序,在运行过程中都不可避免的可能出现各种各样的异常,而程序运行中的异常可以预料但是不可避免,所以我们有必要运用一个异常处理的机制来处理这些有可能出现的异常情况3。异常处理的方式有两种:第一种方式是使用trycatchfinally结构对异常进行捕获和处理;地二种方式是通过throws和throw抛出异常,本设计中使用的是前者。trycatchfinally异常处理方式的基本结构为:trycatch()finally其中:try:将有可能出现异常的代码块括起来,预处理。程序运行中,如果该块内的代码没有出现任何异常,将正常执行,后面的各cat

12、ch块不起任何作用;如果该块内的代码出现了异常,系统将终止Try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块代码。catch():出现异常,捕捉处理。一个try块可以对应多个catch块,用于对多个异常进行捕获。如果要捕获的多个异常之间没有父子关系,各类catch块的顺序无关紧要,但如果他们之间有父子关系,应该将子类的catch放在父类的catch之前,即从小到大排列catch。finally:无论有没有异常,都会执行,当没有出现异常时,先执行try内代码,再执行finally代码;当出现异常执行完对应异常类的catch块后,再执行finally块。一般情况用于资源(n

13、et,io)的回收。2.4 Java线程每个java程序都有一个主线程,要实现多线程,必须在主线程中创建新的线程。Java中,线程用Tread类及其子类的对象来表示。每个线程都要经历新建、运行、中断和死亡四种状态。线程的基本实现方法为:1构造线程new;2启动线程Start( );3运行线程 run( ),因此我们可以得到一个Java线程的建立及运行的基本结构为:new Thread() public void run().start() 多线程机制是Java语言的又一重要特征,使用多线程技术可以使系统同时运行多个执行体,这样可以加快程序的响应时间,提高计算机资源的利用率。实现多线程有两个途径

14、,一种是用Thread类的子类创建来实现,另一种是通过实现Runnable接口的类来实现。在本设计中是用创建Thread类的子类来实现多线程客户端与服务器端的通信的。当编写Thread类的子类时,可以在子类中重写父类的run方法,该方法中包含了线程的操作。这样程序需要建立自己的线程时,值需要建立一个已定义好的Thread子类的实例就可以了。当创建的线程调用start()方法开始运行时,run()方法将被自动进行4。2.5 流Java的输入/输出是以流的方式来处理的,流是在计算机输入、输出操作中流动的数据序列。输入流代表从外设流入计算机的数据序列,输出流代表从计算机流向外设的数据序列。流式输入、

15、输出的特点是数据的获取和发送均按数据序列进行,每一个数据都必须等待排在它前面的数据读入或送出之后才能被读写,每次操作处理的都是序列中剩余的未读写数据中的第一个,而不能随意选择输入输出的位置。序列中的数据既可以是未经加工的原始二进制数据,也可以是按一定编码处理后符合某种格式规定的特点数据,如字符数据,所以Java中的流有位流(字节流)和字符流之分5。本次课程设计中运用的是字符流,而要实现字符流的传输,其设计顺序为:获得文件输入输出流;使用转换流将字节流转为字符流;包装;读写;输出流清除缓存;关闭流。 3设计步骤本次课程设计进行Web服务器的设计与实现,其步骤分为两大步,先要进行用户图形界面的设计

16、与实现,由于它不是本次设计报告的侧重点,故在以下的步骤中只会稍加说明。而本文的重点在于说明Web服务器I/O端口的实现,即Web服务器是如何实现与客户端(浏览器)的连接与数据传输的,故在下面会详细的说明。3.1 设计流程图通过分析设计任务,本次课程设计的大致流程如图3.1所示设计图形界面,并为图形界面添加监听声明一个图形界面实例变量并调用,引入Frame(图形界面)框架声明一个ServerSocket用一个线程Thread和异常处理机制定义start方法用一个异常处理机制定义stop方法开始结束用一个多线程继承Thread实现服务器端与客户端之间的通信(字符流)调用主函数main运行图 3.1

17、 Web服务器设计流程图3.2 创建用户界面 首先,创建一个顶级的容器组件,一般是继承框架(Frame)的应用程序主窗口,它包含边框、标题栏、控制菜单和内容面板的容器,以下程序段主要是将组件声明并且实例化。 public class WebServerFrame extends JFrame implements ActionListener private JPanel btnPan = new JPanel(new FlowLayout(FlowLayout.CENTER); private JLabel listenPortLb = new JLabel(Server listen po

18、rt: ); public WebServerFrame() initComponent(); /init组件net = new WebServerNet(this); 然后,按指定的布局管理器向容器添加组件,给事件的组件添加事件监视器,注册事件处理。它分为三部分:对图形用户界面整体进行声明、实例化和布局private void initComponent() 对控制面板内的组件进行布局和实现其功能public void buildBtnPan() 对信息面板内的组件进行声明并且实例化,实现其功能public void buildHintPan() 最后,对按钮的动作进行设置,即设置档用鼠标点

19、击Start和Clear Hint按钮时将会出现的状况。Web服务器用户界面如图3.2所示。图3.2 Web服务器用户界面3.3 I/O接口的实现 本次课程设计报告主要是描述I/O接口的实现,即Web服务器是如何实现与客户端(浏览器)的连接与数据传输的。在编程时,我们首先第一步是要声明将要用到的实例变量,由于我们需要把设计的两大部分即用户界面部分和I/O接口部分联系起来,故需要声明一个代表用户界面的事例变量frame,并引入WebServerFrame框架。同时,由于我们要实现通信,故需要声明一个服务器端的ServerSocket对象,创建一个ServerSocket对象就创建了一个监听,用来

20、监听客户端(浏览器)的请求。其代码段为:private WebServerFrame frame; /声明一个frame事例变量private ServerSocket serverSocket;/声明一个服务器端ServerSocket对象public WebServerNet(WebServerFrame frame) /引入Frame框架this.frame=frame;进行完变量的声明后我们就要开始对相关的方法进行编写了。首先编写的是start方法,即用鼠标点击“Start”按钮后将会实现的功能。在编写的start方法中,我们运用了异常处理机制和线程。其程序段如下所示:public v

21、oid start(String port)try serverSocket=new ServerSocket(Integer.parseInt(port); frame.addHint(new Date().toLocaleString()+ : Server start on port +port+.);new Thread()/匿名内部类,构造线程public void run() /运行线程trywhile(true)/无限循环Socket socket=serverSocket.accept();/随时监听客户端请求new HandlerThread(socket).start();

22、catch (Exception e)JOptionPane.showMessageDialog(frame, e.getMessage();.start(); /启动线程catch (Exception e) JOptionPane.showMessageDialog(frame, e.getMessage();从以上的程序段中我们可以看出,实现start方法运用了两个trycatch分别处理可能出现的异常情况,在第一个trycatch异常处理语句中,我们首先创建了一个指定端口的Socket对象来监听该端口,但是端口必须为整型数字,若不为整型,则程序将会出现异常,然后为frame中的“Sta

23、rt”按钮addHint,故点击“Start”按钮将会出现:当前时间+erver start on port+IP地址+.。接下来运用一个匿名内部类来建立一个Thread线程,该线程实现的功能为不断的接收从浏览器客户端发送的请求。线程的基本实现方法为:1构造线程new;2启动线程Start( );3运行线程 run( )。程序中的线程构造方法即为基本实现方法,首先构造了一个线程,即语句中的new Thread(),然后在线程中构造一个执行线程的代码块public void run(),线程类里面的业务逻辑都是在run方法中,运行时会自动调用此方法,在构造run()方法中我们运用了一个tryca

24、tch异常处理机制,用来处理线程中将会出现的异常,该方法中用while(true)死循环语句和ServerSocket对象的accept()方法来实现不断的接收客户端的请求。最后调用线程的.start方法来启动线程。如果以上的方法中的任何一步出现错误,即异常,则由catch语句捕捉异常,即执行catch中的语句。如此就完成了start方法的实现。接下来是编写stop方法,它与start方法一样,同样采用了一个异常处理机制,它的try语句为if(serverSocket!=null)/ ServerSocket不为空serverSocket.close();/拆除连接即当ServerSocket

25、不为空(服务器处于正在执行的状态中),强制关闭Web服务器。在该方法中还采用了一个finally语句,即不管是否出现异常情况,都会执行该语句。故最后stop实现的功能为:关闭Web服务器,显示:当前时间+ : Server stop.。接下来是I/O接口实现中最重要的部分,以多线程实现服务器与浏览器之间的数据传送。该部分使用HandlerThread类继承Thread类的方法,实现多线程的数据流传输。在这个多线程的实现中,同样的采用了trycatchfinally的异常处理机制来处理能出现的异常情况。而在多线程的执行块run()中,采用了字符流的传输方法。字符流的传输分为:获得文件输入输出流;

26、使用转换流将字节流转为字符流;包装;读写;输出流清除缓存;关闭流。程序中in=newBufferedReader(new InputStreamReader(socket.getInputStream();即完成了文件输入流的获取、字节流向字符流的转换和包装成加强流,而out=new PrintStream(socket.getOutputStream();完成了输出流的获得。接下来是流的读取,即从浏览器提交的请求头部中获得想访问的文件名称,可以用以下代码段来实现。/从浏览器提交的请求头部中获得想访问的文件名称String src=in.readLine().split( )1;/将浏览器想获

27、得的文件名称输出至提示框frame.addHint(new Date().toLocaleString()+ : Client +hostName+ get file +src+.);由于程序中是运用的Get方法从服务器上获得数据,而Get是不安全的,因为在传输过程,数据被放在请求的URL中,数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而“?”后面的数据即为用户的私人数据,这样就使用户的私人信息变为可见了,这样是极不安全的,故我们采用了一下语句来弥补Get语句带来的安全问题。/*对浏览器想获得的文件名称进行去除?后面内容处理*/查

28、找字符串,一直到?为止int index=src.indexOf(?);/取字符串从0到index, 问号后面的就不要了if(index=0)src.substring(0,index);接下来是输出信息,分为输出响应头部信息和输出响应体部信息。输出响应头部信息是通过输出流out.println()实现的,之后通过out.flush()语句来清除缓存。输出体部信息是通过输入流来实现的,其主要语句为:fin=new BufferedInputStream(new FileInputStream(srcFile);完成了数据流是传输之后,最后需要关闭流,其代码段为:/浏览器和服务器间交互的输入流,

29、不为空,关闭流if(in!=null)in.close();/浏览器和服务器间交互的输出流,不为空,关闭流if(out!=null)out.close();/服务器端文件的输入流,不为空,关闭流if(fin!=null)fin.close();以上就完成了Web服务器与客户端(浏览器)之间的数据交换,为了使文件能够被人识别,我们最后还需要对html文件进行解析,其代码段为:public String getContentType(File file)String fileName=file.getName();String type=fileName.substring(fileName.in

30、dexOf(.);String result=null;if(.gif.equals(type) result=image/gif;else if(.html.equals(type) result=text/html;else if(.htm.equals(type) result=text/html;else if(.txt.equals(type) result=text/plain;else if(.xml.equals(type) result=text/xml;return result;通过这一系列的程序设计后,最终就完成了Web服务器与浏览器之间的通信。3.4 调用主函数运行调

31、用主函数运行后,将出现Web服务器界面,这时启动Web服务器,然后从另一台连网的计算机上打开一个浏览器,在地址栏里面输入Web服务器的Socket套接字,就可以实现服务器与浏览器的连接,服务器中将出现一系列的信息。3.5 结果分析编写完所有程序后,在主函数程序中右击鼠标,在出现的菜单栏中单击Run运行,会出现设计的Web服务器界面,界面中出现一行字:Please click the START button to start web server.。这时单击“Start”按钮,然后从计算机上打开浏览器,在地址栏里面输入Web服务器的Socket套接字,即输入:http:/localhost:8

32、080,即可实现对本机的连接,服务器面板中显示本机浏览器的连接情况。若从另一台连网的计算机上打开一个浏览器,在地址栏里面输入Web服务器的Socket套接字,即输入:Web服务器所在主机的IP地址:8080,即可实现Web服务器与浏览器的连接,Web服务器面板中显示连接的那台计算机浏览器的连接情况。如图3.3所示,为Web服务器监听本机浏览器的情况。图3.3 Web服务器监听本机浏览器4出现的问题及解决方法本实验中出现的问题主要有以下几点:1.要运用相关的方法时,必须要导入相关的包。包是Java提供的组织类和接口的机制,是一组相关类和接口的集合,在引用其他包中的类或接口时,在其名前加包名很不方

33、便,为此Java提供了导入包中类或接口的机制。挡在一个源程序中使用import导入包后,就可以直接引用其中的类或接口了。如果在使用一个未定义的类或接口时没有导入包,那么程序中将提示出错,这是通常只要在程序最开始导入将要使用的接口所属的包就行了。2.在使用一个变量或组件前要先声明,然后再实例化,最后才能使用。如果未经声明、实例化,那么系统会提示这个变量是不存在的,程序将会出现错误。3.在进行线程的设计时,要记得调用Thread的.start()语句,否则线程是无法运行的,程序将出现错误。4.在最后进行Web服务器与浏览器的连接测试时,要先打开Web服务器,并点击“Start”按钮使服务器开始运行

34、,在打开浏览器,在浏览器的地址栏中输入相关的Socket,服务器与浏览器才能建立连接,否则是连接不上的。5结束语参考文献1李尊朝,苏军.Java语言程序设计(第二版).北京:中国铁道出版社,20072马争鸣.TCP/IP原理与利用M.北京:冶金工业出版社:20063315safe.深入学习Linux下的网络监听技术.eNet网络学院,附录1:package com.briup.gui;/导包import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Toolkit;i

35、mport java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import .WebServerNet;public class WebServerFrame extends JFrame implements ActionListener /*声明并初始化用户面板里面的组件*/ 按钮面板:在声明实例变量的同时初始化/设置面板里面的东西居中对齐private JPanel btnPan = new JPanel(new FlowLayout(FlowLayout.CENTER

36、);/标签private JLabel listenPortLb =new JLabel(Server listen port: );/每次开始运行的初始端口为8080,文本框长度为5private JTextField portTf =new JTextField(8080, 4);/按钮设置private JButton controlBtn = new JButton(Start); private JButton clearHintBtn = new JButton(Clear Hint);/ 提示信息面板,文本区域,定义并实例化private JTextArea hintTa = n

37、ew JTextArea();/自己写的程序,作为一个实例变量被调用private WebServerNet net;public WebServerFrame() /init组件initComponent();/对net变量实例化net = new WebServerNet(this); /*对图形用户界面整体进行声明、实例化和布局*/private void initComponent() /声明组件buildBtnPan();buildHintPan();/设置界面的大小setSize(400, 300); / 获取默认工具包。Toolkit tool = Toolkit.getDefa

38、ultToolkit();/设置界面出现在屏幕上的位置setLocation( (tool.getScreenSize().width - this.getSize().width)/2, (tool.getScreenSize().height - this.getSize().height)/2 ); /设置标题setTitle(O.T WebServer ); /点叉叉的时候所有的功能停止setDefaultCloseOperation(EXIT_ON_CLOSE); /窗口可以最小化和关闭,但是不能被任意改变大小setResizable(false); /可视化组建(如窗口、面板等)可

39、见,表示这个组建显示为可见setVisible(true); /*对控制面板内的组件进行布局和实现其功能*/public void buildBtnPan() /声明组件btnPan.add(listenPortLb);btnPan.add(portTf);btnPan.add(controlBtn);btnPan.add(clearHintBtn);/设置框框的颜色btnPan.setBackground(Color.ORANGE); /把定义的四个组件放到北边add(btnPan, BorderLayout.NORTH); /端口处理,提出端口要求portTf.requestFocus()

40、;/可以用所有的端口portTf.selectAll();/为“Start”Button添加事件监听controlBtn.addActionListener(this); /为“Clear Hint”Button添加事件监听clearHintBtn.addActionListener(this); /*对信息面板内的组件进行声明并且实例化,实现其功能*/public void buildHintPan() /信息面板里面不能输入信息hintTa.setEditable(false);/设置信息面板的颜色hintTa.setBackground(Color.LIGHT_GRAY); /声明并实例

41、化滚动条JScrollPane scrollPane = new JScrollPane();/设置何时出现滚动条scrollPane.setBorder(BorderFactory.createLoweredBevelBorder();/返回当前的JviewportscrollPane.getViewport().add(hintTa);/添加滚动条add(scrollPane, BorderLayout.CENTER); /进入服务器出现字符:hintTa.setText(Please click the START button to start web server.);/*对按钮的动

42、作进行设置*/public void actionPerformed(ActionEvent arg0)/定义并且实例化一个sourceObject source = arg0.getSource();/如果点击“Clear Hint”按钮,则清空信息框里面的字符串if (source = clearHintBtn) hintTa.setText();return;String msg = controlBtn.getText();/如果点击“Start”按钮,则“Start”按钮名变为“Stop”,文本框里面不能再输入端口号,开始获取浏览器信息if (msg.equals(Start) co

43、ntrolBtn.setText(Stop);portTf.setEditable(false);net.start(portTf.getText();/如果点击“Stop”按钮,则按钮名变为“Start”,文本框里面能够输入端口号,停止获取服务器信息else controlBtn.setText(Start);portTf.setEditable(true);net.stop();/字符先换行再输出public void addHint(String s) hintTa.setText(hintTa.getText() + rn + s);附录2:package ;/导包import jav

44、a.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintStream;import .ServerSocket;import .Socket;import java.util.Date;import javax.swing.JOptionPane;import co

45、m.briup.gui.WebServerFrame;public class WebServerNet /声明变量private WebServerFrame frame;/声明一个服务器端ServerSocket对象private ServerSocket serverSocket;/引入Frame框架public WebServerNet(WebServerFrame frame)this.frame=frame;/*定义start方法*/public void start(String port)/将有可能出现异常的代码块括起来,预处理try /创建一个指定端口的Socket对象,端口

46、必须为整形数字serverSocket=new ServerSocket(Integer.parseInt(port);/点击“Start”信息面板里面出现的内容frame.addHint(new Date().toLocaleString()+ : Server start on port +port+.); /*匿名内部类*/new 一个线程new Thread()/执行线程的代码块run()public void run() /不断的接收从浏览器客户端发送的请求try /死循环,无限循环 while(true) /引用ServerSocket对象的accept()方法,能够随时监听客户端

47、的请求Socket socket=serverSocket.accept();new HandlerThread(socket).start();/起动线程/循环出现异常,捕捉异常catch (Exception e)JOptionPane.showMessageDialog(frame, e.getMessage();.start();/开始执行线程 /线程出现异常,捕捉异常catch (Exception e) JOptionPane.showMessageDialog(frame, e.getMessage();/*定义stop方法*/public void stop() try/Ser

48、verSocket不为空(服务器处于正在执行的状态中)if(serverSocket!=null)/拆除连接serverSocket.close();/try里面出现异常,捕捉异常catch(Exception e)/无论是否出现异常,点击stop键都会出现 time+“:Server stop”finallyframe.addHint(new Date().toLocaleString()+ : Server stop.);/*构造器:每发一次请求构造一次客户端*/class HandlerThread extends Thread /创建客户端Socket对象,用于与服务器建立连接priv

49、ate Socket socket;/声明主机名private String hostName; /成员内部类public HandlerThread(Socket socket)this.socket=socket;/获得客户端地址this.hostName=socket.getInetAddress().getHostAddress();/输出信息frame.addHint(new Date().toLocaleString()+ : Client +hostName+ connect.); /定义多线程的run()方法public void run()/浏览器和服务器间交互的输入流Buf

50、feredReader in=null;/浏览器和服务器间交互的输出流PrintStream out=null; /服务器端文件的输入流BufferedInputStream fin=null; /得到一系列的信息try /输入流,加强流,字节流转换成字符流in=newBufferedReader(newInputStreamReader(socket.getInputStream();/输出流,字节流out=new PrintStream(socket.getOutputStream();/从浏览器提交的请求头部中获得想访问的文件名称 读字符串,用空格分开,读每个数组的第二个元素头部信息,从第二个才有效String src=in.readLine().split( )1; /将浏览器想获得的文件名称输出至提示框frame.addHint(new Da

温馨提示

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

评论

0/150

提交评论