计算机网络课程设计简单web服务器.docx

上传人:b****2 文档编号:17604079 上传时间:2023-07-27 格式:DOCX 页数:15 大小:438.05KB
下载 相关 举报
计算机网络课程设计简单web服务器.docx_第1页
第1页 / 共15页
计算机网络课程设计简单web服务器.docx_第2页
第2页 / 共15页
计算机网络课程设计简单web服务器.docx_第3页
第3页 / 共15页
计算机网络课程设计简单web服务器.docx_第4页
第4页 / 共15页
计算机网络课程设计简单web服务器.docx_第5页
第5页 / 共15页
计算机网络课程设计简单web服务器.docx_第6页
第6页 / 共15页
计算机网络课程设计简单web服务器.docx_第7页
第7页 / 共15页
计算机网络课程设计简单web服务器.docx_第8页
第8页 / 共15页
计算机网络课程设计简单web服务器.docx_第9页
第9页 / 共15页
计算机网络课程设计简单web服务器.docx_第10页
第10页 / 共15页
计算机网络课程设计简单web服务器.docx_第11页
第11页 / 共15页
计算机网络课程设计简单web服务器.docx_第12页
第12页 / 共15页
计算机网络课程设计简单web服务器.docx_第13页
第13页 / 共15页
计算机网络课程设计简单web服务器.docx_第14页
第14页 / 共15页
计算机网络课程设计简单web服务器.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机网络课程设计简单web服务器.docx

《计算机网络课程设计简单web服务器.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计简单web服务器.docx(15页珍藏版)》请在冰点文库上搜索。

计算机网络课程设计简单web服务器.docx

计算机网络课程设计简单web服务器

计算机网络课程设计报告

专业:

网络工程

学号:

**********

*******

***************

 

2012年3月2日

简单Web服务器的设计与实现

1.设计任务

完成一个简单的WEB服务器的设计与实现,要求能够通过HTTPGET命令获得一个简单的HTML文件(可以带图片);

开发平台:

windows7、eclipse、Java

2.系统分析

WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。

WWW的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。

HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

HTTP协议的作用原理包括四个步骤:

  

(1)连接:

Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。

  

(2)请求:

Web浏览器通过socket向Web服务器提交请求。

HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。

GET命令的格式为:

  GET路径/文件名HTTP/1.1

  文件名指出所访问的文件,HTTP/1.1指出Web浏览器使用的HTTP版本。

  (3)应答:

Web浏览器提交请求后,通过HTTP协议传送给Web服务器。

Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。

  例:

假设客户机与:

8000/index.html建立了连接,就会发送GET命令:

GET/index.htmlHTTP/1.1。

主机名为的Web服务器从它的文档空间中搜索文件index.html。

如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。

  为了告知Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。

常用的HTTP头信息有:

  ①HTTP1.1200OK

  这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。

代码“200OK”表示请求完成。

  ②MIME_Version:

1.0

  它指示MIME类型的版本。

  ③content_type:

类型

  这个头信息非常重要,它指示HTTP体信息的MIME类型。

如:

content_type:

text/html指示传送的数据是HTML文档。

  ④content_length:

长度值

  它指示HTTP体信息的长度(字节)。

  (4)关闭连接:

当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

3.总体设计

根据上述HTTP协议的作用原理,实现GET请求的Web服务器程序的方法如下:

(1)创建ServerSocket类对象,监听端口默认为8000,可以通过服务器界面修改。

(2)等待、接受客户机连接到端口8000,得到与客户机连接的socket,运用多线程技术接收多个客户的请求,并进行响应;

(3)创建与socket字相关联的输入流instream和输出流outstream;

(4)从与socket关联的输入流instream中读取一行客户机提交的请求信息,请求信息的格式为:

GET路径/文件名HTTP/1.1

(5)从请求信息中获取请求类型。

如果请求类型是GET,则从请求信息中获取所访问的HTML文件名。

没有HTML文件名时,则以index.html作为文件名;

(6)如果HTML文件存在,则打开HTML文件,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,然后关闭文件。

否则发送错误页面error.html给Web浏览器;

(7)关闭与相应Web浏览器连接的socket字。

由此,决定用java开发一个简单的服务器,带有简单的图形界面,可以设定服务器的端口号,并可随时启动和停止服务器。

能接受多个用户的请求,并进行响应,能显示请求和响应的情况。

外加一个时钟表,显示系统时间。

 

系统功能图如下:

 

4.详细设计

用Java实现Web服务器的主要设计步骤及程序

(1)eclipse新建web服务器的java项目,具体如下图:

(2)设计主函数程序

Main为主类,具体代码如下:

package;

importjavax.swing.UIManager;

publicclassMain

{

publicstaticvoidmain(String[]args)

{

try

{//界面风格

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

}catch(Exceptione1){}

newServerFrame();

}

}

(3)设计Web服务器的图形界面

ServerFrame为服务器的主界面类,用于构造服务器的界面。

服务端口可以修改相应的端

口号,开始按钮和停止按钮实现服务器的开启与关闭,中间的文本域textArea显示客户的请求情况和服务器的响应情况,清空按钮用来清空文本域。

下方的TimeLabel显示系统当前时间。

主要代码如下:

publicclassServerFrameextendsJFrameimplementsActionListener

{

JPanelpanel=newJPanel();

JLabelstate=newJLabel("关闭状态");

JTextFieldportText=newJTextField("8000",8);

JButtonstart=newJButton("开始",newImageIcon("images/start.gif"));

JButtonstop=newJButton("停止",newImageIcon("images/stop.gif"));

JButtonclear=newJButton("清空",newImageIcon("images/clear.gif"));

JTextAreatextArea=newJTextArea();

JScrollPanejs=newJScrollPane(textArea);

ServerSocketserver=null;

Socketsocket=null;

TimerLabeltime=newTimerLabel();

intcouter=1;

publicServerFrame()//初始化界面

{

setIconImage(newImageIcon("images/top.gif").getImage());

setTitle("简单Web服务器");

setBounds(200,100,500,400);

setLayout(newBorderLayout());

add(panel,BorderLayout.NORTH);

add(time,BorderLayout.SOUTH);

panel.add(state);

panel.add(newJLabel("服务端口:

"));

panel.add(portText);

panel.add(start);

panel.add(stop);

panel.add(clear);

stop.setEnabled(false);//刚开始,stop不可用

start.addActionListener(this);

stop.addActionListener(this);

clear.addActionListener(this);

add(js);

textArea.setLineWrap(true);

textArea.setEditable(false);

setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

publicvoidactionPerformed(ActionEvente)//按钮事件

{

intport=Integer.parseInt(portText.getText());//获取文本作为端口号

if(e.getSource()==start)//启动服务器

{

state.setText("开启状态");

start.setEnabled(false);//启动后,start不可用,stop可用

stop.setEnabled(true);

try{

server=newServerSocket(port);//创建服务器套接字

textArea.insert("\n服务器已开启\n",0);

//匿名内部类

newThread(){

publicvoidrun(){

try{//无限循环,用于接受多个客户请求

while(true){

socket=server.accept();//接受客户机连接,生成套接字

textArea.insert("报告,收到请求:

"+String.valueOf(couter++)+"\n",0);

textArea.insert("时间:

"+time.getTime()+"\n",0);

newServerThread(socket,textArea).start();//启动线程,进行回复

}

}catch(Exceptione){}

};

}.start();

}catch(Exceptione1){}

}

if(e.getSource()==stop)//停止服务器

{

//关闭服务器套接字server

try{

if(server!

=null)

{server.close();

textArea.insert("\n服务器已关闭\n",0);

}

}catch(Exceptione2){}

couter=1;//计数重置

state.setText("关闭状态");

stop.setEnabled(false);//设置按钮可用性

start.setEnabled(true);

JOptionPane.showMessageDialog(this,"服务器成功关闭!

","提示",JOptionPane.CLOSED_OPTION);

}

if(e.getSource()==clear)//清空文本域

{

textArea.setText("");

}

}

}

(4)设计接收线程类

ServerThread继承与Thread类,使用多线程技术实现多客户请求,并进行相应

主要代码如下:

publicclassServerThreadextendsThread

{

Socketsocket=null;

JTextAreatextArea=null;

publicServerThread(Socketsocket,JTextAreatextArea)

{

this.socket=socket;

this.textArea=textArea;

}

publicvoidrun()

{

finalStringCRLF="\r\n";

BufferedReaderin=null;//输入流缓冲

DataOutputStreamout=null;//数据输出流

FileInputStreamfin=null;//文件输入流

try

{

in=newBufferedReader(newInputStreamReader(socket.getInputStream()));

out=newDataOutputStream(socket.getOutputStream());

Stringstring=in.readLine();//读取浏览器请求头部第一行

StringTokenizerst=newStringTokenizer(string);//字符窜分割

if(st.nextToken().equals("GET"))//判断请求方式

{

Strings=st.nextToken();//分割获取请求的文件名

if(s.equals("/"))//如果请求文件为空,返回主页面index.html

{

s="/index.html";

}

Filefile=newFile(s.substring

(1));

textArea.insert("用户:

"+socket.getInetAddress().toString().substring

(1)+"端口:

"+String.valueOf(socket.getPort())+"\n",0);

textArea.insert("请求:

"+string+"\n",0);

if(file.exists())//如果找到文件

{

textArea.insert("\n回复成功,亲\n",0);

}

else{//如果没找到请求文件,则返回error.html页面

file=newFile("error.html");

textArea.insert("\n悲剧啊,没找到页面\n",0);

}

//输出响应头部信息

out.writeBytes("HTTP/1.0200OK"+CRLF);

if(file.getName().endsWith(".jpg"))

out.writeBytes("Content-Type:

image/jpeg"+CRLF);

if(file.getName().endsWith(".gif"))

out.writeBytes("Content-Type:

image/gif"+CRLF);

out.writeBytes(CRLF);

//输出响应体部信息

try

{

fin=newFileInputStream(file);

}catch(FileNotFoundExceptione)

{

System.out.println("找不到");

}

byte[]buffer=newbyte[1024];

intbytes=0;

while((bytes=fin.read(buffer))!

=-1){

out.write(buffer,0,bytes);

}

}

}catch(IOExceptione)

{

e.printStackTrace();

}finally

{//关闭流

try{

if(in!

=null)in.close();

if(out!

=null)out.close();

if(fin!

=null)fin.close();

}catch(Exceptione2){}

}

}

}

(5)简单的TimeLabel类

该类直接继承JLabel类,主要功能是获取系统当前时间,并显示在JLabel上,

其实例作为一个时钟表。

具体代码省略。

5.运行调试

在服务器的根目录下,新建多个html页面,作为一个简单站点,具体如下:

运行打开服务器按开始按钮开启服务,端口号默认为8000,可自行修改:

在浏览器上输入http:

//180.136.66.123:

8000/index.html,结果如下:

服务器对客户请求进行回复(可清空显示的客户请求及响应信息):

6.设计总结

此次课程设计完成了一个简单的Web服务器,程序明了,有简单清新的服务器界面,能真正实现web服务,对多客户的请求进行相应的回复。

但是其中还有一些小错误,这是自己对Java的理解和应用不够成熟所致。

通过这次课程设计,是我进一步了解web服务器与客户端的交互情况,加强了对HTTP传输协议的理解,学会网络编程的不少知识。

在这个网络技术快速发达的年代,web服务有着举足轻重的地位,我们每天上网都离不开它。

因此,掌握web开发技术对我未来的发展必定有很大帮助。

这次课程设计,也让我深深体会到自己的Java道路还很漫长,以后必须多多练习,学以致用。

 

参考文献

[1]孙卫琴.《Java网络编程精解》.北京:

电子工业出版社,2007.3

[2]Y.DanielLiang《Java语言程序设计基础篇》北京:

机械工业出版社,2008年2月1日

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2