计算机网络课程设计简单web服务器.docx
- 文档编号:17604079
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:15
- 大小:438.05KB
计算机网络课程设计简单web服务器.docx
《计算机网络课程设计简单web服务器.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计简单web服务器.docx(15页珍藏版)》请在冰点文库上搜索。
计算机网络课程设计简单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日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 课程设计 简单 web 服务器