本文主要是分析一个简单的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.跨语言  文件夹与文件的io操作集合  草案

    Atitit.跨语言  文件夹与文件的io操作集合  草案 1. Jdk原生的太难用了..1 2. PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷 ...

  2. C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

    先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warni ...

  3. python使用hbase

    #coding:utf-8 __author__ = 'similarface' from multiprocessing import Process import happybase import ...

  4. linux下调试使用的 一些shell命令

    查看文件日期:strings |grep Build gdb g++ gcc make systemctl gdb: bt s n b 1.firewalld的基本使用 启动: systemctl s ...

  5. LeetCode300. Longest Increasing Subsequence

    Description Given an unsorted array of integers, find the length of longest increasing subsequence. ...

  6. Android-X86 VirtualBox 安装安卓后的一些设置

    可以用虚拟机设置双显卡,一个用于调试,一个用于连接外网 一个桥接一个host only 安卓Home键 -> Win键 安装返回键 -> ESC键 ALT + F1 调出管理员控制台 AL ...

  7. 大数据(4) - HDFS常用的shell操作

    注意:这次使用的是第二部分安装的集群,不是高可用集群 为了方便,开发,必须写集群脚本,试想集群的机器是100台以上,而不是3台的情况.... 集群启动脚本 vim /home/admin/tools/ ...

  8. [前端开发] 未来趋势“无后端”的web应用开发模式

    最近看到前端趋势2013大会上的一篇文章,题目是<各位快看,不用后端>,觉得有点意思,恰好近期的一次讨论及半年前的一次开发实践也涉及到这种模式,简单谈谈我的想法. 不得不说,文章的题目确实 ...

  9. 用记事本写的java程序引用jar文件

    1.将须要用的jar文件和java程序复制到同一个文件文件夹下 2.进行编译.编译的命令:javac -cp log4j-1.2.15.jar A.java 3.进行运行.运行的命令:java -cp ...

  10. python 自动化之路 day 18 前端内容回顾、补充/Django安装、创建

    前端回顾: 整体: - HTML - CSS - JavaScript - 基本数据类型 - for,while.. - DOM - obj = document.getElementById('.. ...