资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

关于go语言关闭http连接的信息

http.ServeMux

HTTP协议全称超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和WWW服务器之间通信的规则,通过Internet传送WWW文档的数据传送协议。

创新互联公司-专业网站定制、快速模板网站建设、高性价比碑林网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式碑林网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖碑林地区。费用合理售后完善,十余年实体公司更值得信赖。

Web服务是HTTP协议的一个服务,HTTP协议承载在TCP协议之上。Web服务工作流程

基于HTTP构建的服务标准模型包括客户端和服务端,HTTP请求从客户端发出,服务端接收到请求后进行处理,然后将响应返回给客户端。

HTTP服务端核心工作是如何接收来自客户端的请求,并向客户端返回响应。当HTTP服务器接收到客户端请求时,首先会进入路由模块,路由又称为服务复用器(Multiplexer),路由的工作在于请求找到对应的处理器(Handler),处理器对接收到的请求进行对应处理后,构建响应并返回给客户端。

Go语言通过引入 net/http 包来实现HTTP网络访问,并提供HTTP客户端和服务端的实现。

创建HTTP服务需经过2个阶段

例如:创建HTTP服务

理解HTTP服务关键点在于路由器和处理器

服务复用器

处理器

http.ServeMux 内部使用一个 map 映射来保存所有处理器, http.muxEntry 是一个多路复用器入口实体。

可以发现在 http.muxEntry 字段中存在着 http.Handler 接口类型的 h

虽然 http.ServeMux 也实现了 http.ServerHTTP() 算得上是一个 http.Handler ,但 http.ServeMux 的 http.ServeHTTP() 并非用来处理请求和响应,而是用来查找注册路由对应的处理器。

当 http.ServeMux 路由器设置路由规则后,会通过它实现的 ServeHTTP() 完成请求的分发。当路由器接收到请求后若请求的URI为 * 则会关闭连接,否则会调用自身的 Handler() 来获取对应路由的处理器,最终通过调用 h.ServeHTTP(w,r) 实现对应路由的实现逻辑。

路由器会根据用户请求的URL路径去匹配自身存储的在 map 中的 handler ,最终调用匹配到的 handler 的 ServeHTTP() 以实现执行对应路由的处理函数。

创建 http.ServeMux 实例的方式有两种

http.DefaultServeMux 是默认的 http.ServeMux ,会随着 net/http 包初始化而被自动初始化。

当 http.ListenAndServe() 在没有提供其他处理器的情况下,即它的入参 handler 为 nil 时内部会使用 http.DefaultServeMux 。

net/http 包提供了一组快捷的注册路由的函数 http.Handle() 、 http.HandleFunc() 来配置 http.DefaultServeMux ,快捷函数会将处理器注册到 http.DefaultServeMux 。

二者之间的区别在于 handler 参数上

http.Handle() 的 handler 是一个 http.Handler 接口实例,也就是说传入的 handler 必须要自己提前实现 http.Handler 接口的 ServerHTTP(ResponseWriter, *Request) 方法。

例如:将处理器放入闭包中,将参数传入处理器。

http.HandleFunc() 的 handler 直接是一个原型为 func(ResponseWriter, *Request) 的函数,深入追踪会 HandleFunc() 会发现一个自定义的函数类型。

因此任何具有 func(ResponseWriter, *Request) 签名的函数都能转换成为一个 http.HandlerFunc 类型的对象。同时自定义的函数类型中已经实现了 ServeHTTP() 方法,因此它也是一个 http.Handler 。

例如:返回时使用一个到 http.HandlerFunc 类型的隐式转换

net/http 包提供了 http.NewServeMux() 来创建一个自定义的 http.ServeMux 实例

例如:调用 http.NewServeMux() 会创建服务复用器

例如:创建静态服务

Go中没有继承、多态,可通过接口来实现。而接口则是定义声明的函数签名,任何结构体只要实现与接口函数签名相同的方法,即等同于实现了对应的接口。

例如: http.HandleFunc() 处理函数实现实际上调用默认 http.DefaultServeMux 的 HandleFunc() 方法

例如:调用 http.Handle() 方法则第二个参数 handle 必须实现 http.Handler 接口的 ServeHTTP() 方法,也就是说只要具有 ServeHTTP() 签名方法即可作为处理器。

例如:自定义处理器

http.HandlerFunc 自身已实现 http.Handler 接口的 ServeHTTP() 方法,因此它也是一个处理器。

http.HandlerFunc 的作用是将自定义函数转换为 http.Handler 处理器类型,当调用 http.HandlerFunc(fn) 后会强制将 fn 函数类型转换为 http.HandlerFunc 类型,这样 fn 函数就具有了 ServeHTTP() 方法,同时也就转换成为了一个 http.Handler 处理器。因此 http.HandlerFunc 又称为适配器。

HTTP(超文本传输协议)关闭?

80端口是为HTTP(HyperText Transport Protocol,超文本传输协议)开放的,主要用于在WWW(World Wide Web,万维网)服务上传输信息的协议,用IE访问一般的网站都是通过这个端口,所以如果要访问网站,必须开启这个端口!

如果想关闭,可以到本地连接-》“属性”-》“TCP/IP协议“-》“属性”-》“高级”-》“选项”-》“TCP/IP筛选”-》“属性”-》把TCP端口中选择为只允许一些端口,然后把常用的TCP端口填进去,不填80端口就关闭了,常用端口请查相关资料!

建议用防火墙或杀毒软件监听80端口,可以保护80端口安全!

HTTP 的连接和断开

这样就完成了http连接的3次握手操作。

我们可以通过wireShark抓包工具来获取http三次握手的整个过程

首先打开WireShark,选择 Loopback 过滤条件

我们看下http断开时的四次挥手的整个过程

我们关闭其中一个终端即可断开http连接,利用WireShark来抓取整个过程

个人理解,在进行http连接时,客户端首先向服务器端发送连接的通信,然后服务器立即同意了对方通信的要求,因为此时还没有连接,服务器端没有未处理完的事务,可以即刻向对方发出通信的请求,最后等待客户端的同意。在http断开时,客户端向服务器端发出close请求,然后,服务器端同意客户端发出的close请求,因为服务器端可能还没处理完 移动端上次请求的事务,不能立即发出close请求,需要等到处理完成后再向客户端发出close请求。再服务器器处理完之后,向移动端发出close请求,最后移动端同意服务器端发出的close请求。


当前文章:关于go语言关闭http连接的信息
文章源于:http://cdkjz.cn/article/dddjsop.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220