首页 > 代码库 > Golang 文件服务器小结

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 = DefaultServeMux15     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         return22     }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["/"] = sayHello33     err := server.ListenAndServe()34     if err != nil {35         log.Fatal("ListenAndServe: ", err)36     }37 }
View Code

 

Golang 文件服务器小结