多线程WebServer设计与实现Word下载.docx
- 文档编号:16745847
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:10
- 大小:802.47KB
多线程WebServer设计与实现Word下载.docx
《多线程WebServer设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《多线程WebServer设计与实现Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
0指出Web浏览器使用的HTTP版本。
3)应答:
Web浏览器提交请求后,通过HTTP协议传送给Web服务器。
Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
三、实验方法
Java实现Web服务器功能的程序设计
根据上述HTTP协议的作用原理,实现GET请求的Web服务器程序的方法如下:
1)创建ServerSocket类对象,监听端口8080。
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字.
四、实验过程
1.首先打开开发工具MyEclipse8.5
MyEclipse8.5是一个开放源代码的、基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
向MyEclipse8.5中输入如下Web服务器程序源码:
importjava。
io。
*;
importjava。
net。
*;
publicclassWebServer{
public staticvoidmain(Stringargs[]) {
ﻩint i=1,PORT=8080;
ﻩServerSocketserver=null;
Socketclient=null;
try{
server=newServerSocket(PORT);
system。
out。
println("
WebServeris listeningonport”+server.getLocalPort());
for (;
;
){
client=server.accept();
// 接受客户机的连接请求
newConnectionThread(client,i).start();
ﻩ i++;
ﻩ }
}catch(Exceptione){System.out.println(e);
}
}
}
/* ConnnectionThread类完成与一个Web浏览器的通信*/
classConnectionThreadextends Thread{
ﻩSocket client;
//连接Web浏览器的socket字
ﻩintcounter;
//计数器
publicConnectionThread(Socketcl,int c) {
client=cl;
ounter=c;
}
publicvoidrun()// 线程体
{
try {
StringdestIP=client.getInetAddress().toString();
//客户机IP地址ﻩ
int destport=client.getPort();
//客户机端口号
ﻩSystem.out。
println(”Connection"
+counter+"
:
connectedto”+destIP+"
onport”+destport+”.");
PrintStreamoutstream=newPrintStream(client.getOutputStream());
DataInputStreaminstream=newDataInputStream(client。
getInputStream());
ﻩStringinline=instream.readLine();
// 读取Web浏览器提交的请求信息
System。
out.println(”Received:
"
+inline);
ﻩif(getrequest(inline)){ //如果是GET请求
Stringfilename=getfilename(inline);
Filefile=newFile(filename);
if(file.exists()) {//若文件存在,则将文件送给Web浏览器
ﻩ System.out。
println(filename+"
requested。
);
ﻩ outstream.println("HTTP/1.0200OK");
ﻩ outstream.println("
MIME_version:
1.0"
ﻩ outstream.println("Content_Type:
text/html");
ﻩ int len=(int)file。
length();
outstream.println("Content_Length:
+len);
outstream.println("");
ﻩﻩ sendfile(outstream,file);
//发送文件
outstream.flush();
ﻩ}else{// 文件不存在时
Stringnotfound="
<html〉<
head><title>
NotFound<
/title>
<
/head>
body>
h1〉您访问的这个文件不存在,请您仔细核对!
!
/h1>〈hr〉<
/body>
/html>
”;
outstream。
println(”您访问的这个文件不存在,请您仔细核对!
!
”);
outstream。
println("
Content_Type:
text/html"
outstream。
println("
Content_Length:
+notfound.length()+2);
outstream.println("
);
outstream。
println(notfound);
ﻩoutstream.flush();
}
}
ﻩ longm1=1;
while(m1<
11100000){m1++;
} //延时
ﻩﻩclient.close();
}catch(IOExceptione){
System.out.println(”Exception:
+e);
ﻩ }
}
/*获取请求类型是否为“GET"
*/
booleangetrequest(Strings){
if(s.length()〉0){
ﻩ if(s。
substring(0,3).equalsIgnoreCase(”GET”))returntrue;
ﻩ }
ﻩ return false;
ﻩ}
/* 获取要访问的文件名*/
Stringgetfilename(Strings) {
ﻩStringf=s.substring(s.indexOf(’’)+1);
f=f。
substring(0,f。
indexOf(’'
));
try{
ﻩ if(f.charAt(0)=='/'
)
f=f.substring
(1);
} catch(StringIndexOutOfBoundsException e){
System。
println(”Exception:
”+e);
}
if(f.equals(”"
)) f=”index。
html"
return f;
}
/*把指定文件发送给Web浏览器 */
voidsendfile(PrintStreamouts,File file){
try {
DataInputStreamin=new DataInputStream(newFileInputStream(file));
int len=(int)file.length();
bytebuf[]=newbyte[len];
in.readFully(buf);
outs.write(buf,0,len);
outs.flush();
in.close();
} catch(Exceptione){
System。
out。
println("
Errorretrievingfile。
");
System。
exit
(1);
}
}
}
在MyEclipse8.5中如下图:
2、为了测试上述程序的正确性,将编译后的WebServer.class、ConnectionThread.class和下面的index.html文件置于本机的同一目录中在dos里运行web服务器.
index.html的代码如下:
<
HTML〉
<
HEAD>
〈META HTTP-EQUIV="
Content—Type"
content="text/html;
charset=gb_2312-80"
>
〈TITLE〉Java开发多线程Web服务器<
/TITLE>
〈/HEAD〉
<BODY>
〈h3>
这是用JAVA写出的多线程WEB服务器的主页!
</h3>
2014年9月27日
<
hr>
</BODY>
</HTML〉
3、然后在客户机运行浏览器软件,在URL处输入web程序所属的URL地址(如:
http:
//10。
50。
142.45:
8080/index.html)或(如:
http:
//10.50.142。
45:
8080/),就在浏览器窗口显示出指定的HTML文档.
1)单一browser请求
2)多browser并发通信同时发出三次请求实现多线程通信,如下图所示:
3)如果文件请求不存在文件如s。
txt
结束语
本次设计就是完成一个简单的多线程Web服务器,实现web服务器基本功能:
页面访问请求响应、HTML文件的解析以及数据发送。
本次设计的Web服务器,除了完成网络通信链路的建立和拆除之外至少还要有二方面的功能:
“分折请求”和“构造响应”.客户端与服务器交换数据之前,首先用TCP/IP建立连接,客户端向服务器请求数据,服务器则向客户端响应并提供数据。
客户端和服务器以HTTP协议进行请求和响应。
服务器和客户端只能为一次事务处理建立并维持连接,完成一次事务处理后便结束连接。
接收客户端请求、解析客户端请求、响应客户端请求、向客户端回送请求的结果是Web服务器所需完成的主要任务,Web服务器程序代码主要是为了完成这几项任务。
Web服务器通常由以下几个部分组成,也就是本次设计的主要内容:
(1)服务器初始化部分。
这部分主要完成Web服务器的初始化工作,如建立守护进程、创建TCP套接字、绑定端口、将TCP套接字转换成侦听套接字,进入循环结构,等待接收用户浏览器连接。
(2)接收客户端请求.由于客户端请求以文本行的方式实现,所以服务器一般也以文本行为单位接收。
(3)解析客户端请求。
这部分工作比较复杂,需要解析出请求的方法、URL目标、可选的查询信息及表单信息。
如果请求方法为HEAD,则简单地返回响应首部即可;
如果方法是GET,则首先返回响应首部,然后将客户端请求的URL目标文件从服务器磁盘上读出,再发送给客户端;
如果是POST,则比较麻烦,首先要调用相应的CGI程序,然后将用户表单信息传给CGI程序,CGI程序根据表单内容完成相应的工作,并将结果数据返回。
(4)发送响应信息之后,关闭与客户机的连接.
最后实际设计完成结果基本达到要求,实现了页面访问请求响应、HTML文件的解析以及数据发送.当然,也有很多遗憾,比如对于多线程的Web还不是很熟悉,端口、套接字的实现仍有些模糊,这几点是以后如果有机会或者时间一定要争取改进的地方。
参考文献
[1]HarveyM.Deitel等著邱仲潘等译。
JavaWeb服务高级教程 。
第一版.机械工业出版社,2003.7
[2]孙卫琴. 《Java网络编程精解》. 北京:
电子工业出版社,2007。
3
[3]刘贺湘.《Internet实用技术教程》.北京:
清华大学出版社,1998
[4]吴凤祥。
《用Java实现一个Socket通信模型》。
《现代电子技术》,2001.7.20,1~5
[5]耿祥义、张跃平.Java2实用教程(第三版).清华大学出版社.2006
[6]周小松,朱雄军,基于TCP协议的Socket网络编程模式部署及实现,软件技术研究[J],2006(9)
[7]罗惟,王萍。
一个web服务器的设计[J].现代电子技术,2003,157(14)
[8]JamesF。
Kurose,Keith W.Ross《COMPUTERNETWORKING——ATop-DownApproach》.高等教育出版社第四版
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 WebServer 设计 实现