一个Browser的HTTP请求(一)
本文主要是分析一个简单的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请求(一)的更多相关文章
- 一个完整的Http请求
一个完整的http请求,通常有以下7点: 1.建立tcp连接 2.web浏览器web服务器发送请求命令 3.web浏览器发送请求头信息 4.web服务器应答 5.web服务器发送应答信息 6.web服 ...
- 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
新建一个MVC4的项目,引用DAL后,将DAL的连接字符串考入: <connectionStrings> <add name="brnmallEntities&qu ...
- “无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性 “之解决
今天在学习插件系统设计的时候遇到一个问题:“System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型. 于是百度一下,很多内容都差不多 ...
- 使用一个HttpModule拦截Http请求,来检测页面刷新(F5或正常的请求)
在Web Application中,有个问题就是:“我怎么来判断一个http请求到底是通过按F5刷新的请求还是正常的提交请求?” 相信了解ASP.NET的人知道我在说什么,会有同感,而且这其实不是一个 ...
- 实现一个简单的http请求工具类
OC自带的http请求用起来不直观,asihttprequest库又太大了,依赖也多,下面实现一个简单的http请求工具类 四个文件源码大致如下,还有优化空间 MYHttpRequest.h(类定义, ...
- JavaWeb:一个Servelt多个请求
一个Servelt多个请求 基础模拟 方法一:使用switch方法 一.方法介绍 方法:switch 优点:方法简单,明了 缺点:维护麻烦,保密性不好 二.代码实现 1.servlet类 packa ...
- 一个标准的AJAX请求
这是一个标准的ajax请求: $.ajax({ type:"post", url:basePath+"/resourcePush/operationLog", ...
- 一个简易的Http请求转发器
这两天一直再看微信开发,临时在我的电脑搭了个IIS服务器做微信开发,外网也能访问了,关键是,调试太麻烦了!! 我写完代码,要将代码发布到IIS才能接收微信消息,可是在这个过程中,我不知道微信发过来的是 ...
- wpf prism4 出现问题:无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
WPF Prism 框架 程序 出现 问题: 无法加载一个或多个请求的类型.有关更多信息,请检索 LoaderExceptions 属性. 1.开始以为是配置的问题,找了半天,最后原来是有个依赖类库没 ...
随机推荐
- Atitit.跨语言 文件夹与文件的io操作集合 草案
Atitit.跨语言 文件夹与文件的io操作集合 草案 1. Jdk原生的太难用了..1 2. PS: apache commons-io包,FileUtils有相关的方法,IOUtils一般是拷 ...
- C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间
先来看下面的例子: #include <stdlib.h> #include <string.h> #include <stdio.h> #pragma warni ...
- python使用hbase
#coding:utf-8 __author__ = 'similarface' from multiprocessing import Process import happybase import ...
- linux下调试使用的 一些shell命令
查看文件日期:strings |grep Build gdb g++ gcc make systemctl gdb: bt s n b 1.firewalld的基本使用 启动: systemctl s ...
- LeetCode300. Longest Increasing Subsequence
Description Given an unsorted array of integers, find the length of longest increasing subsequence. ...
- Android-X86 VirtualBox 安装安卓后的一些设置
可以用虚拟机设置双显卡,一个用于调试,一个用于连接外网 一个桥接一个host only 安卓Home键 -> Win键 安装返回键 -> ESC键 ALT + F1 调出管理员控制台 AL ...
- 大数据(4) - HDFS常用的shell操作
注意:这次使用的是第二部分安装的集群,不是高可用集群 为了方便,开发,必须写集群脚本,试想集群的机器是100台以上,而不是3台的情况.... 集群启动脚本 vim /home/admin/tools/ ...
- [前端开发] 未来趋势“无后端”的web应用开发模式
最近看到前端趋势2013大会上的一篇文章,题目是<各位快看,不用后端>,觉得有点意思,恰好近期的一次讨论及半年前的一次开发实践也涉及到这种模式,简单谈谈我的想法. 不得不说,文章的题目确实 ...
- 用记事本写的java程序引用jar文件
1.将须要用的jar文件和java程序复制到同一个文件文件夹下 2.进行编译.编译的命令:javac -cp log4j-1.2.15.jar A.java 3.进行运行.运行的命令:java -cp ...
- python 自动化之路 day 18 前端内容回顾、补充/Django安装、创建
前端回顾: 整体: - HTML - CSS - JavaScript - 基本数据类型 - for,while.. - DOM - obj = document.getElementById('.. ...