




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
搭建一个简单的服务器,贝毅君 浙江大学软件学院,主要内容,Tomcat总体结构 HTTP请求与响应 Socket与ServerSocket 搭建简单的web服务器,Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的组件是Catalina Servlet容器,其他的组件按照一定的格式要求配置在这个顶层容器中。,Tomcat简介,Tomcat简介,/bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml /doc:存放Tomcat文档 /server:包含三个子目录:classes、lib和webapps /server/lib:存放Tomcat服务器所需的各种JAR文件,Tomcat简介 - 目录结构,/server/webapps:存放Tomcat自带的两个WEB应用admin应用和 manager应用 /common/lib:存放Tomcat服务器以及所有web应用都可以访问的jar文件 /shared/lib:存放所有web应用都可以访问的jar文件(但是不能被Tomcat服务器访问) /logs:存放Tomcat执行时的日志文件,Tomcat简介 - 目录结构,/src:存放Tomcat的源代码 /work:存放JSP产生的servlet文件 /webapps:Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录 /helloapp:Web应用的根目录,所有的jsp文件和html文件都在此目录下 /helloapp/WEB_INF:存放该web应用发布时的描述文件web.xml /helloapp/WEB_INF/class:存放各种class文件,Servlet文件也存放于此目录下 /helloapp/WEB_INF/lib:存放各钟Web应用所需要的jar文件。比如可以存放JDBC驱动程序的JAR文件,Tomcat简介 - 目录结构,以helloapp应用为例 helloapp(/webapps/helloapp/Web-INF/下的classes,lib子目录中*.calss及*.jar,仅helloapp可以加载) Bootstrap ($JAVA_HOME/jre/lib/ext/*.jar) System ($CLASSPATH/*.class和CLASSPATH中指定的jar),Tomcat简介 加载资源顺序,Common ($CATALINA_HOME/common/下的classes,lib,endores子目录中*.class及*.jar) Catalina ($CATALINA_HOME/server/下的classes,lib子目录中*.calss及*.jar,仅Tomcat可以加载) Shared ($CATALINA_HOME/shared/下的classes,lib子目录中*.calss及*.jar,仅所有Web应用可以加载),Tomcat简介 加载资源顺序,Tomcat总体结构,Tomcat的各个组件是在 conf server.xml文件中配置的,下面通过分析server.xml文件来理解Tomcat的各个组件是如何组织的。,Tomcat总体结构,Tomcat简介,Server组件对应元素,它是配置文件的最顶层元素,代表一个服务器。一个配置文件中只能有一个元素。,Service组件是一些Connector组件的集合,它本身不是一个容器。一个Service组件中只能有一个Engine组件,可以包含多个Connector组件。,Connector组件表示一个接口,通过这个接口接收客户的请求,然户发送给其他的容器组件,最后再把服务器的响应结果传递给客户。,容器类元素:为特定的虚拟主机处理所有客户请求,可包含多个Context,容器类元素:为特定的Service组件处理所有客户请求,可包含多个Host。,容器类元素:为特定的Web应用处理所有客户请求,Tomcat总体结构,Server: 一个Server代表整个Catalina Servlet容器。 Service: 由多个Connector组成,以及一个Engine,处理所有Connector所获得的客户请求。,Tomcat总体结构 基本组件,Connector:一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。 TOMCAT有两个典型的Connector Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求 Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求,Tomcat总体结构 基本组件,Engine: Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名。 当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理 Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理。,Tomcat总体结构 基本组件,Host:代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配 每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path 当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理匹配的方法是“最长匹配”,所以一path=“的Context将成为该Host的默认Context所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配,Tomcat总体结构 基本组件,Context: 一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成。 Context在创建的时候将根据配置文件$CATALINA_HOME / conf/ web.xml和$WEBAPP_HOME /WEB-INF/web.xml载入Servlet类。当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类如果找到,则执行该类,获得请求的回应,并返回。,Tomcat总体结构 基本组件,假设来自客户的请求为: http:/localhost:8080/wsota/wsota_index.jsp 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host,Tomcat处理Http请求过程,Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) localhost Host获得请求/wsota /wsota_index.jsp ,匹配它所拥有的所有Context Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为“的Context去处理),Tomcat处理一个Http请求过程,path=“/wsota“的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法,Tomcat处理一个Http请求过程,Context把执行完了之后的HttpServletResponse对象返回给Host Host把HttpServletResponse对象返回给Engine Engine把HttpServletResponse对象返回给Connector Connector把HttpServletResponse对象返回给客户browser,Tomcat处理一个Http请求过程,Servlet容器是一个复杂的系统,对每个请求,servlet容器会为其完成以下3个操作: 创建一个request对象,用可能会调用的Servlet中使用的信息填充该request对象,如参数、头、cookie、查询字符串、URI等。 创建一个调用Servlet的response对象,用来向Web客户端发送响应。 调用Servlet的service()方法,将request对象和response对象作为参数传入。Servlet从requset对象中读取信息,并通过response对象发送响应信息。,Tomcat总体结构 servlet容器是如何工作的,Tomcat总体结构 Catalina,Catalina是一个设计和开发得十分优美,功能结构也模块化的成熟软件。 Catalina是Tomcat的核心结构。 连接器负责将一个请求与容器相关联。它的工作包括为它接收到的每个HTTP请求创建一个Request对象和一个Response对象。 连接器将处理过程交给容器。容器从连接器中接受到request对象和response对象,并负责调用相对应的Servlet的service()方法。,Http请求,Http请求包含了三部分: 请求方法 URI(统一资源标识符) 协议/版本 请求头 实体 POST /examples/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Language: zh-CN, zh Connection: Keep-Alive Host: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19 Content-Length: 33 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate lastName=Franks&firstName=Michael,HTTP响应,HTTP响应也包含三部分: 协议 状态码 描述 响应头 响应实体段 HTTP/1.1 200 OK Server: Microsoft-IIS/4.0 Date: Mon, 5 Jan 2004 13:13:33 GMT Content-Type: text/html Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT Content-Length: 112 HTTP Response Example Welcome to Brainy Software ,HTTP Request Header详解(一),HTTP Request Header详解(二),套接字(socket)是网络连接的端点。套接字使应用程序可以从网络中读取数据,可以向网络中写入数据。通过OutputStream发送字符流,通过InputStream接收字符流。 常用构造方法: public Socket(String host, int port) public Socket(InetAddress address, int port) public Socket(String host, int port, InetAddress localAddr,int localPort) InetAddress对象可以进行ip和域名相互查询,通过ip获取时不需要访问DNS服务器, 返回结果包含了主机名的字符串。实用方法如下: InetAddress.getByName(“”),Socket,Socket本地服务器通信Demo,Socket socket = new Socket(““, 8080); boolean autoflush = true; PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); out.println(“GET /index.jsp HTTP/1.1“); out.println(“Host: localhost:8080“); out.println(“Connection: Close“); out.println();,发送请求内容,Socket本地服务器通信Demo,boolean loop = true; StringBuffer sb = new StringBuffer(8096); while(loop) if(in.ready() int i = 0; while(i!=-1) i = in.read();sb.append(char)i); loop = false; Thread.currentThread().sleep(50); System.out.println(sb.toString(); socket.close();,获取接收到信息,ServerSocket,ServerSocket类与Socket类不相同, 服务器套接字要等待来自客户端的连接请求。当服务器套接字收到连接请求后,它会创建一个Socket实例来处理与客户端的通信。 构造方法 public ServerSocket(int port, int backLog, InetAddress bindingAddress) 使用示例 new ServerSocket(8080, 1, InetAddress.getByName(“”),搭建简单的web服务器,简单的web服务器示例仅仅需要3个类,仅支持输出静态资源的请求和传入的HTTP请求字节流。 HttpServer类代表web服务器,主函数入口新建实例后一直等待HTTP请求。 Request类代表Http请求。通过parse()方法解析原始数据并通过parseUri()方法将URI变量获取。 Response类代表Http响应。通过setRequest()方法传入Request对象,通过sendStaticResource()方法发送静态资源到浏览器。,HttpServer,public class HttpServer public static final String WEB_ROOT = System.getProperty(“user.dir“) + File.separator + “webroot“; private static final String SHUTDOWN_COMMAND = “/SHUTDOWN“; private boolean shutdown = false; public static void main(String args) HttpServer server = new HttpServer(); server.await(); public void await() / TODO 循环等待服务器请求 ,HttpServer await(),ServerSocket serverSocket = null; int port = 8080; serverSocket = new ServerSocket(port, 1, InetAddress.getByName(““); while (!shutdown) Socket socket = null; InputStream input = null; OutputStream output = null; socket = serverSocket.accept(); input = socket.getInputStream(); output = socket.getOutputStream(); Request request = new Request(input); request.parse(); Response response = new Response(output); response.setRequest(request); response.sendStaticResource(); socket.close(); shutdown = request.getUri().equals(SHUTDOWN_COMMAND); ,解析 请求,接受到/SHUTDOWN命令则结束应用程序,Request,public class Request private InputStream input; private String uri; public Request(InputStream input) this.input = input; public void parse() / TODO 转化InputStream的字节流到字符缓存,并执行解析过程 private String parseUri(String requestString) / TODO 从已转化的字符缓存从获取Uri字符串 public String getUri() return uri; ,Public void parse() StringBuffer request = new StringBuffer(2048); int i; byte buffer = new byte2048; try i = input.read(buffer); catch(IOException e) e.printStackTrace(); for(int j = 0; j i; j+) request.append(char) bufferj); System.out.print(request.toString(); uri = parserUri(request.toString(); ,Request parse(),获取请求字符串中第一个空格和第二个空格之间的字符串,private String parseUri(String requestString) int index1, index2; index1 = requestString.indexOf( ); if (index1 != -1) index2 = requestString.indexOf( , index1 + 1); if (index2 index1) return requestString.substring(index1 + 1, index2); return null; ,Request parseUri(),获取第一个空格的位置,获取index1+1后面的第一个空格的位置,返回index1+1到index2之间的子字符串,为什么这就是URI?,public class Response private static final int BUFFER_SIZE = 1024; Request request; OutputStream output; public Response(OutputStream output) this.output = output; public void setRequest(Request request) this.request = request; public void sendS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 锅炉设备试压工压力容器操作特项考核试卷及答案
- 非典捐赠协议书
- 钟表及计时仪器制造工跨部门项目协调考核试卷及答案
- 隧道工消防考核试卷及答案
- 公司速录师岗位职业健康及安全技术规程
- 2026届广东省云浮云城区五校联考七年级数学第一学期期末调研试题含解析
- 河北省保定市安国市2026届九年级数学第一学期期末监测模拟试题含解析
- 2025家居用品(沙发)购销合同
- 2025房屋租赁终止合同模板
- 2025房屋租赁合同范本范文
- 2025少先队基础知识题库(含答案)
- 人教版九年级物理上-各单元综合测试卷含答案共五套
- 三折页设计课件
- 防诈骗消防安全知识培训课件
- 2025至2030年川渝地区成品油行业市场运行现状及未来发展预测报告
- 减肥与能量代谢课件
- 《三借芭蕉扇》课件
- 《生态系统服务评估》课件
- eOps自动化运维平台介绍
- 心脏病患者非心脏手术麻醉管理
- 公路交通安全设施工高级工培训内容
评论
0/150
提交评论