Golang 文件服务器小结

花了一个星期学习文件服务器,老是在一些地方搞混,整理一下所学的,清晰了不少。

学Go半个月,还有很多不懂的地方,有理解错误的,还望高手指出。

注:以下代码中,w为http.ResponseWriter类型, r为*http.Request类型

1、先该清楚一些类型的意义:

Handler:处理请求和生成返回的接口。其实就是接口。

ServerMux:路由,也是一种Handler。还是接口。

Request:用户的请求信息,用来解析用户的请求信息包括,POST、GET、Cookie、URL等信息。

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

ResponseWriter:生成Response的接口。也还是接口

Conn:网络连接。

 

ServerMux有map表,map的key是r.URL.String(),而Value记录的是一个方法,这个方法与ServeHTTP是一样的,也叫HandlerFunc。另一个方法是Handle 用来注册HandlerFunc。

ServeMUx实现Handler接口,充当http.ListenAndServe()的第二个参数。

 

http.ListenAndServe()的第二个参数是Handle接口,实现配置外部路由器(也就是非默认的路由器)。

 

2、设置路由的方法:

(1)

func  fooHandler(w,r){  }

http.Handle("/foo", fooHandler)//此处是http.Handle,而不是http.Handler

(2)

http.HandleFunc("/foo",  func(w,r){

//处理

})

以上配置的是默认路由

如果自己使用了ServeMux作为路由,就得用其他配置方法了

(3)配置ServeMux路由

1)

mux:=http.NewServeMux()

mux.Handle("/foo",&fooHandler{})//第二个参数是一个Handler,可以是定义一个Handler接口,也可以是返回Handler的函数。比如:StripPrefix(prefix string, h Handler) Handler {}等。

type  fooHandler  struct{}

func  (*fooHandler)serveHTTP(w,r){

//处理

}

2)

mux:=http.NewServeMux()

mux.HandleFunc("/foo", fooHandler)

func  fooHandler(w,r){

//处理

}

3)

 Var  mux  map[string] func(w,r)

mux=make[string]func(w,r)

mux["/foo"]=fooHandler

func fooHandler(w,r){

}

再定义一个Handler作为默认的handler,实现路由

type myHandler  struct{}

func  (*myHandler)ServeHTTP(w,r){

    if h,ok:=mux[r.URL.String()];ok{  //注意mux[]的匹配。需要的时候,要用path包,比如我就用到了mux[path.Dir(r.URL.path)]。

       h(w,r)

       return

    }

}

server自己定义:

server:=http.Server{

        Addr: ":9090",
        Handler: &myhandler{},  //myhandler在这里使用
        ReadTimeout: 5 * time.Second,
}

 

 

3、简单文件服务器实现的三种方法

(1)

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "log"
 6     "net/http"
 7 )
 8 
 9 func sayHello(w http.ResponseWriter, r *http.Request) {
10     fmt.Fprintf(w, "%v", "Hello,this is from FileServer1.") //输出到客户端
11 }
12 func main() {
13     http.HandleFunc("/", sayHello)
14     err := http.ListenAndServe(":9090", nil) //使用默认handler = DefaultServeMux
15     if err != nil {
16         log.Fatal("ListenAndServe: ", err)
17     }
18 }
FileServer1

(2)

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "log"
 6     "net/http"
 7 )
 8 
 9 type myhandler struct {
10 }
11 
12 func sayHello(w http.ResponseWriter, r *http.Request) {
13     fmt.Fprintf(w, "%v", "Hello,this is from FileServer2.")
14 }
15 func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
16     fmt.Fprintf(w, "%v", "Bye,this is from FileServer2.")
17 }
18 
19 func main() {
20     mux := http.NewServeMux()
21     mux.Handle("/b", &myhandler{})
22     mux.HandleFunc("/", sayHello)
23     err := http.ListenAndServe(":9090", mux)
24     if err != nil {
25         log.Fatal("ListenAndServe: ", err)
26     }
27 }
View Code

(3)

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "log"
 6     "net/http"
 7     "time"
 8 )
 9 
10 type myhandler struct {
11 }
12 
13 var mux map[string]func(http.ResponseWriter, *http.Request)
14 
15 func sayHello(w http.ResponseWriter, r *http.Request) {
16     fmt.Fprintf(w, "%v", "Hello,this is from FileServer3.")
17 }
18 func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
19     if h, ok := mux[r.URL.String()]; ok {
20         h(w, r)
21         return
22     }
23 }
24 
25 func main() {
26     server := http.Server{
27         Addr:        ":9090",
28         Handler:     &myhandler{},
29         ReadTimeout: 5 * time.Second,
30     }
31     mux = make(map[string]func(http.ResponseWriter, *http.Request))
32     mux["/"] = sayHello
33     err := server.ListenAndServe()
34     if err != nil {
35         log.Fatal("ListenAndServe: ", err)
36     }
37 }
View Code

 

转载于:https://www.cnblogs.com/iamrly/p/3927673.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gohttp是一个http的文件服务器,因为是用go语言写的,所以加了一个go的抬头。之所以用go是因为发布起来是一个二进制文件,不同的平台都可以用,而且没有依赖问题,且稳定性也很好。    这个软件从很久以前就开始写了,第一次提交实在2015年的2月11号,作为组内存放公共文件的一个小软件。一开始的功能只有像 python -mSimpleHTTPServer 那种简单的功能。但是当我看到gotty这个软件的时候 ,意思到一个简单的软件竟然可以做到如此出色。之后这个http文件服务器就不断的被优化着,保持着简单易用的同时,开始赋予了它最强大的功能。    这个软件有很多的技术,隐藏在了其简易朴实的外表之下。请容我简单的介绍下pjax简称页面ajax技术        在gohttp进行目录却换的时候,你会看到地址栏在变,但是页面却是局部刷新的。各种文件的预览功能        所有常见的代码都可以直接在gohttp下预览,如果你用的是chrome浏览器的话,包括pdf,mp4,mp3都可以直接预览。实时的目录zip打包下载        强大的体现在它是实时的,即使你马上在目录下新增了一个文件,点击目录zip下载的时候,这个文件也会出现在里面。二维码的支持        手机下载往往没有电脑下载这么容易,点点鼠标就可以了。但是有了二维码,手机也只用扫一扫就可以下载了。苹果应用的在线安装        iphone应用安装包的扩展名是ipa,但是你还必须有个额外的plist文件才行。以及生成一个itms-services开头的地址,gohttp直接把这些工作都做了,ipa的解析,plist以及下载页面的自动生成。同普通文件一样,只需要点击右侧的生成二维码,然后用iphone手机扫描下,iphone的应用就安装到了你的手机上。PS:坑爹的苹果,就不能像安卓一样简单一点吗README文件的自动显示像github网站上的项目,readme文件都会作为项目的介绍自动显示出来。gohttp也借鉴了一下。如果目录下有readme文件的话,就会自动预览出来。文件上传简单的文件上传也有着出色的表现,可以看到上传的进度,以及支持拖拽的方式上传文件。为了更方便的结合自动发布的功能,文件上传也有其相应的API,上传的时候也可是指定软件的版本号,存储结构参考了python,pypi官方的模式。还有很多很多其他的特性    http basic auth认证,不同文件不同的icon,gzip支持,目录的整合显示.... 还有很多功能等待着你去发现和有能力的你去补充。    截图  标签:gohttp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值