本文主要是分析一个简单的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. FPGA研发之道(25)-管脚

    管脚是FPGA重要的资源之一,FPGA的管脚分别包括,电源管脚,普通I/O,配置管脚,时钟专用输入管脚GCLK等. 本文引用地址:http://www.eepw.com.cn/article/2664 ...

  2. [ci] 基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成

    基于1 上文实现拉取代码后能自动触发sonar-runner实现代码扫描评测,job1完成   添加sonar插件 SonarQube Plugin   配置: 系统设置à告知jenkins,sona ...

  3. C# 运行时中的泛型

    将泛型类型或方法编译为 Microsoft 中间语言 (MSIL) 时,它包含将其标识为具有类型参数的元数据. 泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同. 第一次用值类 ...

  4. centos 启动 nginx

    service nginx start https://jingyan.baidu.com/article/bad08e1ec2adc709c85121aa.html

  5. ../lib//libscsdblog.so: undefined reference to `pthread_atfork'

    代码中遇到这个问题,但是在makefile中已经添加了-lpthread. 最后发现问题时,引入库的顺序,把-lpthread放在最后就可以了.

  6. qsort的陷阱

    问:求大神解释这个C程序,为什么在compare_strings中使用return strcmp(p, q);就无法正确排序 #include <string.h> #include &l ...

  7. Appium python自动化测试系列之元素的定位(六)

    ​6.1 常用定位方法讲解 对象定位是自动化测试中很关键的一步,也可以说是最关键的一步,毕竟你对象都没定位那么你想操作也不行.所以本章节的知识我希望大家多动手去操作,不要仅仅只是书本上的知识,毕竟这个 ...

  8. 【EasyUI】Tabs常用操作及href和content的异同

    说明:EasyUI版本1.3.4 ,jQuery版本1.8.3 EasyUI Tabs常见使用方式 按照官方文档的说法,创建Tabs的方式有两种: 静态页面标签 动态JS代码 静态方式主要用于创建一些 ...

  9. python 爬虫实战1 爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 本篇目标 抓取糗事百科热门段子 过滤带有图片的段子 实现每按一次回车显示一个段子的发布时间,发布人 ...

  10. SUSE10 SP4源码升级Python到2.6.6

    1.安装依赖包(CentOS可采用yum) zypper in gcc gcc-c++ openssl-devel-32bit openssl-devel readline-devel readlin ...