收藏 分销(赏)

多线程Web-Server设计与实现.doc

上传人:可**** 文档编号:9631397 上传时间:2025-04-01 格式:DOC 页数:11 大小:831KB 下载积分:8 金币
下载 相关 举报
多线程Web-Server设计与实现.doc_第1页
第1页 / 共11页
多线程Web-Server设计与实现.doc_第2页
第2页 / 共11页


点击查看更多>>
资源描述
多线程Web Server的设计与实现 班 级:研1428班 学 号:2141221064 姓 名:王 娇 一、 概述 如今,上网已成为最热门话题,通过Internet,我们既能获取信息又能发布信息,而迅速发展的Web技术更是给Internet应用提供了一个很好的发展方向。当今的许多应用都是基于web技术的,如电子商务、视频会议、远程医疗诊断等。由于HTML 语言的标准统一性,只要在设备里建立一个微型web服务器,人们就可以使用现有的Web浏览器与该设备进行双向交互、接收或发送信息。因此,针对微型web服务器的研究和应用,具有重大的意义,它为我们管理、控制和监测各种各样的设备提供了一个很好的途径一基于Internet,也就是说,只要设备接入了Internet,我们就可以在世界上的任何地方十分方便地控制、操纵那些配备有微型Web服务器的设备。 二、 设计内容 1) 熟悉WWW服务器和WEB服务器的工作原理; 2) 熟悉套接字编程的相关知识; 3) 完成一个简单的WEB服务器的设计与实现,要求能够通过HTTP GET命令获得一个简单的HTML文件; 4) 运行该服务器,并编写一个简单的HTML文件完成测试。 三、 实验原理 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服务器接到后,进行事务处理,处理结果又通过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服务器程序源码: import java.io.*; import .*; public class WebServer { public static void main(String args[]) { int i=1, PORT=8080; ServerSocket server=null; Socket client=null; try { server=new ServerSocket(PORT); system.out.println("Web Server is listening on port"+server.getLocalPort()); for (;;) { client=server.accept(); // 接受客户机的连接请求 new ConnectionThread(client,i).start(); i++; } } catch (Exception e) {System.out.println(e);} } } /* ConnnectionThread类完成与一个Web浏览器的通信 */ class ConnectionThread extends Thread { Socket client; // 连接Web浏览器的socket字 int counter; // 计数器 public ConnectionThread(Socket cl,int c) { client=cl; ounter=c; } public void run() // 线程体 { try { String destIP=client.getInetAddress().toString(); // 客户机IP地址 int destport=client.getPort(); // 客户机端口号 System.out.println("Connection "+counter+":connected to"+destIP+" on port "+destport+"."); PrintStream outstream=new PrintStream(client.getOutputStream()); DataInputStream instream=new DataInputStream(client.getInputStream()); String inline=instream.readLine(); // 读取Web浏览器提交的请求信息 System.out.println("Received:"+inline); if (getrequest(inline)) { // 如果是GET请求 String filename=getfilename(inline); File file=new File(filename); if (file.exists()) { // 若文件存在,则将文件送给Web浏览器 System.out.println(filename+" requested."); outstream.println("HTTP/1.0 200 OK"); 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 { // 文件不存在时 String notfound="<html><head><title>Not Found</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(); } } long m1=1; while (m1<11100000) {m1++;} // 延时 client.close(); } catch (IOException e) { System.out.println("Exception:"+e); } } /* 获取请求类型是否为“GET” */ boolean getrequest(String s) { if (s.length()>0) { if (s.substring(0,3).equalsIgnoreCase("GET")) return true; } return false; } /* 获取要访问的文件名 */ String getfilename(String s) { String f=s.substring(s.indexOf(' ')+1); f=f.substring(0,f.indexOf(' ')); try { if (f.charAt(0)=='/') f=f.substring(1); } catch (StringIndexOutOfBoundsException e) { System.out.println("Exception:"+e); } if (f.equals("")) f="index.html"; return f; } /*把指定文件发送给Web浏览器 */ void sendfile(PrintStream outs,File file) { try { DataInputStream in=new DataInputStream(new FileInputStream(file)); int len=(int)file.length(); byte buf[]=new byte[len]; in.readFully(buf); outs.write(buf,0,len); outs.flush(); in.close(); } catch (Exception e) { System.out.println("Error retrieving file."); 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] Harvey M.Deitel等著邱仲潘等 译.Java Web服务高级教程 .第一版.机械工业出版社,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] James F.Kurose,Keith W.Ross《COMPUTER NETWORKING——A Top-Down Approach》.高等教育出版社 第四版
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服