go语言http原理的简单介绍-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

go语言http原理的简单介绍

http的共享怎么开

这里我介绍两种方法!

创新互联建站是一家专注于网站设计制作、网站设计与策划设计,若羌网站建设哪家好?创新互联建站做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:若羌等地区。若羌做网站价格咨询:18980820575

一  :用IIS或者Apache之类的web服务器软件实现http文件共享

 这里我以IIS为例介绍下用常用的web服务器实现文件共享的方法,具体如下(以我机器为例):

  1、打开IIS,打开“网站 -- 默认网站”,右键点击“属性”,点击“主目录”,勾选“目录浏览”选项,如下图所示:

  

2、进入文件夹C:\Inetpub\wwwroot,拷贝文件“1.7z“到这个目录:

   

3、打开浏览器,输入本机ip(比如我的:192.168.1.123),即可看到共享的文件并可以下载:

   

   点击“1.7z”即可下载。

二  :用python或者go语言实现http文件共享

1、python实现http文件共享:

  用过python的都知道python有一个很牛x的命令:

python -m SimpleHTTPServer

在C:\Python27下运行命令:

 打开浏览器,可以看到如下效果:

 这个命令的默认端口是8000,如果我再加一个端口参数,可以用其它端口进行访问,命令如下:

打开浏览器:

    知道了这个原理,可以写个bat文件,在需要的时候copy到相应的目录双击即可,比如我的httpShare.bat文件如下:

     python -m SimpleHTTPServer 80

     默认用80端口,访问时候只需要输入我的ip地址即可。

2、go语言实现http文件共享:

上面的方法很方便,windows和linux通吃,不过前提是要安装python

这里我有个用go语言实现的,也是windows和linux通吃(windows下不知道怎么配置的可以参考我之前的文章:,类似C/C++,是代码可移植,使用前你只需编译一次。

下面是示例代码(httpShare.go):

package main

import (

"http"

"fmt"

)

func main(){

h := http.FileServer(http.Dir("."))

var port string

fmt.Printf("Please input port Number: ")

fmt.Scanf("%s",port)

http.ListenAndServe(":"+port, h)   

}

运行效果:

http.ServeMux

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

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 又称为适配器。

go语言聊天室实现(六)创建HTTP连接,并升级为长连接

我们在mian函数中,首先初始化配置文件,然后新建http连接。

这个连接创建之后,监听服务器的9999端口。如果url的路径后缀为 "/ws",就转发到ws/ws.go中的IndexHandler方法中。

这个方法中首先我们创建一个websocket的Upgrader实例,然后我们使用Upgrader的upgrade方法来升级一下我们的连接为长连接。

升级完成之后会返回一个*websocket.Conn的连接,我们之后所有的关于连接的操作,都是基于该conn的。

在该连接完成之后,我们将连接存放到一个名为Client的map中,以便之后管理更为方便。

之后,我们启动一个goroutine来读取连接中发送的信息内容,再根据内容进行相应的操作。

Go语言HTTPServer开发的六种实现

学完了 net/http 和 fasthttp 两个HTTP协议接口的客户端实现,接下来就要开始Server的开发,不学不知道一学吓一跳,居然这两个库还支持Server的开发,太方便了。

相比于Java的HTTPServer开发基本上都是使用Spring或者Springboot框架,总是要配置各种配置类,各种 handle 对象。Golang的Server开发显得非常简单,就是因为特别简单,或者说没有形成特别统一的规范或者框架,我发现了很多实现方式,HTTP协议基于还是 net/http 和 fasthttp ,但是 handle 语法就多种多样了。

先复习一下: Golang语言HTTP客户端实践 、 Golang fasthttp实践 。

在Golang语言方面,实现某个功能的库可能会比较多,有机会还是要多跟同行交流,指不定就发现了更好用的库。下面我分享我学到的六种Server开发的实现Demo。

基于 net/http 实现,这是一种比较基础的,对于接口和 handle 映射关系处理并不优雅,不推荐使用。

第二种也是基于 net/http ,这种编写语法可以很好地解决第一种的问题,handle和path有了类似配置的语法,可读性提高了很多。

第三个基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 对象用来处理各类配置包括接口和handle映射,功能很丰富,可读性最佳。

第四种依然基于 net/http 实现,引入了 github.com/gin-gonic/gin 的路由,看起来接口和 handle 映射关系比较明晰了。

第五种基于 fasthttp 开发,使用都是 fasthttp 提供的API,可读性尚可,handle配置倒是更像Java了。

第六种依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有点奇怪两个居然不在一个GitHub仓库里。使用语法跟第三种方式有点类似,比较有条理,有利于阅读。


分享名称:go语言http原理的简单介绍
网站网址:http://kswsj.cn/article/dohpsis.html

其他资讯