本文主要是分析一个简单的web服务器是如何工作的。

若有不恰当或不对之处,请指正!

  • Tomcat和web服务器的关系

  我们常说Tomcat是一个web容器,也常说用户通过浏览器向web服务器进行请求,同时我们也知道,对于web项目来说,我们在启动Tomcat之后,就可以进行一系列的请求服务得到想要的结果了。那么Tomcat和web服务器有啥关联呢?还是说二者就是同一个呢?!

  通过上图的Tomcat内部结构我们可以发现,其实Tomcat内置了一个轻量级的web服务器,即Server,用于转发html请求

  • web服务器相关了解

  从上段我们了解了,Tomcat中的web服务器Server接收到了browser的请求,将其转发给Service等进行处理,那么它是如何截获到该请求的呢?!

  由于web服务器是使用HTTP协议来和客户端进行通信的,采用Socket套接字来建立长连接。

Socket连接至少需要一对套接字,分别是clientSocket(Socket)和serverSocket,其连接分三步:

1)serverSocket无法确定具体clientSocket,因此时刻处于监听状态;

2)客户端请求:clientSocket指定要连接的serverSocket,提供地址和端口号,然后向其发出连接请求;

3)连接:serverSocket收到请求后,响应其请求并创建一个新线程将指定的Socket发给clientSocket。一旦确认无误,就正式建立连接,并通过HTTP进行通信;serverSocket继续处于监听状态并接收其他clientSocket的连接请求。

  Socket代表一个clientSocket,根据接收的主机名和端口号来创建一个套接字:public Socket (java.lang.String host, int port);如new Socket("127.0.0.1",8080);

  创建完之后,就可以根据该实例来发送和接收字节流。如调用Socket的getOutputStream方法来获得java.io.OutputStream对象;而要接收字节流,则调用其getInputStream方法来返回一个java.io.InputStream对象。

  ServerSocket类的创建如下:new ServerSocket(int port, int backLog, InetAddress bindingAddress);其中InetAdres一般为127.0.0.1,用来监听本机机器,也被成为是绑定地址;port则是要进行监听的端口号,backLog是指拒绝request请求之前所传入的request请求的最大队列长度,在Tomcat源码中设置为1.

  有了serverSocket实例,就可以监听指定端口的连接请求。一旦得到请求,就可以调用其accept方法来获取并返回一个socket实例

socket = serverSocket.accept();//只有在得到请求以后才会返回socket实例
  • Web服务器工作过程

  《还得继续补充》

一个Browser的HTTP请求(一)的更多相关文章

  1. 一个完整的Http请求

    一个完整的http请求,通常有以下7点: 1.建立tcp连接 2.web浏览器web服务器发送请求命令 3.web浏览器发送请求头信息 4.web服务器应答 5.web服务器发送应答信息 6.web服 ...

  2. 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

    新建一个MVC4的项目,引用DAL后,将DAL的连接字符串考入: <connectionStrings>     <add name="brnmallEntities&qu ...

  3. “无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性 “之解决

    今天在学习插件系统设计的时候遇到一个问题:“System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型. 于是百度一下,很多内容都差不多 ...

  4. 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)

    在Web Application中,有个问题就是:“我怎么来判断一个http请求到底是通过按F5刷新的请求还是正常的提交请求?” 相信了解ASP.NET的人知道我在说什么,会有同感,而且这其实不是一个 ...

  5. 实现一个简单的http请求工具类

    OC自带的http请求用起来不直观,asihttprequest库又太大了,依赖也多,下面实现一个简单的http请求工具类 四个文件源码大致如下,还有优化空间 MYHttpRequest.h(类定义, ...

  6. JavaWeb:一个Servelt多个请求

    一个Servelt多个请求 基础模拟 方法一:使用switch方法  一.方法介绍 方法:switch 优点:方法简单,明了 缺点:维护麻烦,保密性不好 二.代码实现 1.servlet类 packa ...

  7. 一个标准的AJAX请求

    这是一个标准的ajax请求: $.ajax({ type:"post", url:basePath+"/resourcePush/operationLog", ...

  8. 一个简易的Http请求转发器

    这两天一直再看微信开发,临时在我的电脑搭了个IIS服务器做微信开发,外网也能访问了,关键是,调试太麻烦了!! 我写完代码,要将代码发布到IIS才能接收微信消息,可是在这个过程中,我不知道微信发过来的是 ...

  9. wpf prism4 出现问题:无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

    WPF Prism 框架 程序 出现 问题: 无法加载一个或多个请求的类型.有关更多信息,请检索 LoaderExceptions 属性. 1.开始以为是配置的问题,找了半天,最后原来是有个依赖类库没 ...

随机推荐

  1. Atitit .c#的未来新特性计划草案

    Atitit .c#的未来新特性计划草案 1. C#的未来:追踪空引用1 1.1. 2. 变量命名空间1 1.2. 10. 项目引用Native dll2 1.3. 10. 项目引用Native dl ...

  2. CSS3主要知识点复习总结+HTML5新增标签

    文件夹: 1.CSS 属性编写顺序 2.CSS3属性(内核前缀) 3.position相对/绝对定位 4.overflow:scroll等的差别 5.display属性应用 6.盒模型计算方法和Bug ...

  3. UI-7-UIScrollView

    #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> { UIIm ...

  4. iOS多线程(转)

    关于iOS多线程,你看我就够了 字数8596 阅读28558 评论74 喜欢313 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例 ...

  5. DataUml Design 教程2-实体建模

    DataUml Design 实体建模基于UML类图标准来设计,支持一对一.一对多.多对多关联.模型与开发语言和数据库绑定.1.新建数据模型    1).选择“数据模型” 节点,点击鼠标右键,在菜单中 ...

  6. input子系统分析(转)

    转自:http://www.linuxidc.com/Linux/2011-09/43187.htm 作者:作者:YAOZHENGUO2006 Input子系统处理输入事务,任何输入设备的驱动程序都可 ...

  7. php之curl设置超时实例

    本文实例讲述了php中curl超时设置方法.分享给大家供大家参考.具体实现方法如下: 访问HTTP方式很多,可以使用curl, socket, file_get_contents() 等方法. 在访问 ...

  8. Blue Jeans - poj 3080(后缀数组)

    大致题意: 给出n个长度为60的DNA基因(A腺嘌呤 G鸟嘌呤 T胸腺嘧啶 C胞嘧啶)序列,求出他们的最长公共子序列 使用后缀数组解决 #include<stdio.h> #include ...

  9. 什么时候触发MinorGC?什么时候触发FullGC?

    触发MinorGC(Young GC) 虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间 1.如果大于的话,直接执行minorGC 2.如果小于,判断是否开启 ...

  10. java开发目前技术选型

    目前系统采用 1.后端 服务框架:Dubbo.zookeeper 缓存:Redis.ehcache 消息中间件:ActiveMQ,kafka 负载均衡:Nginx 分布式文件:FastDFS 数据库连 ...