web工作方式的几个概念

以下均是服务器端的几个概念

Request:用户请求的信息,用来解析用户的请求信息,包括post、get、cookie、url等信息

Response:服务器需要反馈给客户端的信息

Conn:用户的每次请求链接

Handler:处理请求和生成返回信息的处理逻辑

分析http包运行机制

  1. 创建Listen Socket, 监听指定的端口, 等待客户端请求到来。

  2. Listen Socket接受客户端的请求, 得到Client Socket, 接下来通过Client Socket与客户端通信。

  3. 处理客户端的请求, 首先从Client Socket读取HTTP请求的协议头, 如果是POST方法, 还可能要读取客户端提交的数据, 然后交给相应的handler处理请求, handler处理完毕准备好客户端需要的数据, 通过Client Socket写给客户端。

这整个的过程里面我们只要了解清楚下面三个问题,也就知道Go是如何让Web运行起来了

  • 如何监听端口?
  • 如何接收客户端请求?
  • 如何分配handler?

前面小节的代码里面我们可以看到,Go是通过一个函数ListenAndServe来处理这些事情的,这个底层其实这样处理的:初始化一个server对象,然后调用了net.Listen("tcp", addr),也就是底层用TCP协议搭建了一个服务,然后监控我们设置的端口。

下面代码来自Go的http包的源码,通过下面的代码我们可以看到整个的http处理过程:

func (srv *Server) Serve(l net.Listener) error {defer l.Close()var tempDelay time.Duration // how long to sleep on accept failurefor {rw, e := l.Accept()if e != nil {if ne, ok := e.(net.Error); ok && ne.Temporary() {if tempDelay == 0 {tempDelay = 5 * time.Millisecond} else {tempDelay *= 2}if max := 1 * time.Second; tempDelay > max {tempDelay = max}log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay)time.Sleep(tempDelay)continue}return e}tempDelay = 0c, err := srv.newConn(rw)if err != nil {continue}go c.serve()}
}

监控之后如何接收客户端的请求呢?上面代码执行监控端口之后,调用了srv.Serve(net.Listener)函数,这个函数就是处理接收客户端的请求信息。这个函数里面起了一个for{},首先通过Listener接收请求,其次创建一个Conn,最后单独开了一个goroutine,把这个请求的数据当做参数扔给这个conn去服务:go c.serve()。这个就是高并发体现了,用户的每一次请求都是在一个新的goroutine去服务,相互不影响。

那么如何具体分配到相应的函数来处理请求呢?conn首先会解析request:c.readRequest(),然后获取相应的handler:handler := c.server.Handler,也就是我们刚才在调用函数ListenAndServe时候的第二个参数,我们前面例子传递的是nil,也就是为空,那么默认获取handler = DefaultServeMux,那么这个变量用来做什么的呢?对,这个变量就是一个路由器,它用来匹配url跳转到其相应的handle函数,那么这个我们有设置过吗?有,我们调用的代码里面第一句不是调用了http.HandleFunc("/", sayhelloName)嘛。这个作用就是注册了请求/的路由规则,当请求uri为"/",路由就会转到函数sayhelloName,DefaultServeMux会调用ServeHTTP方法,这个方法内部其实就是调用sayhelloName本身,最后通过写入response的信息反馈到客户端。

go如何使web工作相关推荐

  1. HTTP协议和web工作原理

    HTTP协议和web工作原理 http://blog.csdn.net/kjfcpua/archive/2009/12/04/4932597.aspx 本章学完之后能干什么? 要把 知识点学好,那就需 ...

  2. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统

    Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...

  3. 运行php能运行asp么,配置使web server即能运行asp又能运行PHP(不装Apache)

    配置使web server即能运行asp又能运行PHP(不装Apache) 时间:2006/7/19 13:36:01 作者:佚名 人气:57 支持ASP不用多余的设置,只要按正确安装了IIS4或II ...

  4. 【CyberSecurityLearning 52】Web架构安全分析(web工作机制、HTTP协议)

    目录 Web 工作机制 网页.网站 Web容器 静态页面 中间件服务器 数据库的出现 建立一个网站 HTTP 协议概述 概述 特点 URL HTTP 报文分析 HTTP 工作模式 REQUEST 请求 ...

  5. 如何开始使用Word2Vec-然后使其工作

    by Kavita Ganesan 通过Kavita Ganesan 如何开始使用Word2Vec-然后使其工作 (How to get started with Word2Vec - and the ...

  6. 使计算机工作必不可缺的软件,探讨测绘工程中计算机制图的运用问题(原稿)

    1.样,对图纸审核工作的开展十分不利.利用CAD软件可以使图形标准工作更加方便地开展,另外还可以在非常多的地共享时也会由于这部分问题导致出现问题,进而增加工作量.探讨测绘工程中计算机制图的运用问题(原 ...

  7. TFS2010迁移后Web工作项访问提示:error HRESULT E_FAIL has been returned from a call to a COM component....

    前天迁移TFS2010的虚拟机,重新映射了数据库服务器后没有发现任何问题.但是今早访问对应Web站点,点击任何一个工作项都提示:error HRESULT E_FAIL has been return ...

  8. 使用Arquillian,Docker和Selenium使Web UI测试再次变得出色(第1部分)

    问题简介 大多数时候,当您需要为Web UI编写功能测试/端到端测试时,您最终会使用Selenium ,它可以被视为Java世界中用于Web UI测试的事实上的工具. 我确定您已经将其用于此类测试. ...

  9. 在家远程办公的工作招聘_使在家工作成功:远程团队的资源

    在家远程办公的工作招聘 If you're a designer or developer, chances are you've made the shift to working from hom ...

最新文章

  1. supersu二进制更新安装失败_helm安装教程
  2. android findviewbyid定义成静态,findViewById 为null???
  3. mysql驱动连接不了mariadb_无法从振动应用程序连接到MySQL / MariaDB数据库
  4. 《电子元器件的可靠性》——第1章概述
  5. 2017《JAVA》预备作业 计科1501班 王奕开
  6. TouchVG 支持 CocoaPods 了!
  7. 迅捷pdf转换器(文件格式转换器)
  8. Tempo - 分布式Loki链路追踪利器
  9. VS 2019Xamarin开发Android App生成apk文件
  10. Python自动化操作word--批量替换word文档中的文字
  11. python共存_多版本Python共存的配置方法
  12. Windows无法调节显示亮度
  13. 爱奇艺APP的自动化录制回放系统 全云化处理新体验
  14. 微信上收到的文件怎么打印出来
  15. Java / Tensorflow - Expects arg[0] to be int64 but int32 is provided 异常处理
  16. 如何在Win10(包括2004版本)下安装64位CATIA
  17. 笔记本外接显卡坞到底有什么用?磐镭发布镭凌linkX显卡坞
  18. 文件上传控件-如何上传文件-大文件断点续传
  19. Git | 登录验证失效问题
  20. ctf web 备份是个好习惯

热门文章

  1. 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )
  2. 【组合数学】组合恒等式 ( 变下项求和 3 组合恒等式 | 变下项求和 4 组合恒等式 | 二项式定理 + 求导 证明组合恒等式 | 使用已知组合恒等式证明组合恒等式 )
  3. 【组合数学】鸽巢原理 ( 鸽巢原理简单形式示例 4、5 )
  4. MyBatis基本运行环境
  5. 【Linux 线程】同一个进程中的线程共享哪些资源
  6. Django ORM 级联删除
  7. 关于C语言的问卷调查
  8. 汇编实验:屏幕窗口程序(代码有较为详细的注释)
  9. 【动态规划】最长公共上升子序列
  10. 纯CSS实现Tab栏的切换