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

学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)

 package main

 import (
"fmt"
"log"
"net/http"
) func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer1.") //输出到客户端
}
func main() {
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":9090", nil) //使用默认handler = DefaultServeMux
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

FileServer1

(2)

 package main

 import (
"fmt"
"log"
"net/http"
) type myhandler struct {
} func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer2.")
}
func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Bye,this is from FileServer2.")
} func main() {
mux := http.NewServeMux()
mux.Handle("/b", &myhandler{})
mux.HandleFunc("/", sayHello)
err := http.ListenAndServe(":9090", mux)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

(3)

 package main

 import (
"fmt"
"log"
"net/http"
"time"
) type myhandler struct {
} var mux map[string]func(http.ResponseWriter, *http.Request) func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%v", "Hello,this is from FileServer3.")
}
func (*myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if h, ok := mux[r.URL.String()]; ok {
h(w, r)
return
}
} func main() {
server := http.Server{
Addr: ":9090",
Handler: &myhandler{},
ReadTimeout: * time.Second,
}
mux = make(map[string]func(http.ResponseWriter, *http.Request))
mux["/"] = sayHello
err := server.ListenAndServe()
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}

Golang 文件服务器小结的更多相关文章

  1. golang 文件服务器

    在go语言中可以用一句代码做一个文件服务器.如果有很多文件需要通过网页来供其他人下载,可以使用这个方法. package main import ( "log" "net ...

  2. Golang格式化小结

    Golang的格式化使用了与c.python等语言类似的风格,但是更加丰富和通用.格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Printl ...

  3. Golang vs PHP 之文件服务器

    前面的话 作者为golang脑残粉,本篇内容可能会引起phper不适,请慎读! 前两天有同事遇到一个问题,需要一个能支持上传.下载功能的HTTP服务器做一个数据中心.我刚好弄过,于是答应帮他搭一个. ...

  4. Golang从文件服务器获取图片显示到客户端

    一.需求 A(客户端)--------------->B(服务端)-------------->C(文件服务器) 在客户端需要显示图片列表,但是不想C(文件服务器)的地址被暴露出来,所以现 ...

  5. 【GoLang】并发小结

    006.并发 1 概念 1.1 goroutine是Go并行设计的核心,goroutine的本质是轻量级线程 1.2 golang的runtime实现了对轻量级线程即goroutine的智能调度管理 ...

  6. golang 服务平滑重启小结

    背景 golang 程序平滑重启框架 supervisor 出现 defunct 原因 使用 master/worker 模式 背景 在业务快速增长中,前期只是验证模式是否可行,初期忽略程序发布重启带 ...

  7. Golang语言细节小结

    前段时间,看了菜鸟入门,较浅的认识一下golang的语法习惯和规则,然后跟别人做了个爬虫项目,但是对于golang语言的语法结构还不是很懂.又看了遍<go实战>第二章. 构建程序在构建可执 ...

  8. golang中字符串的查找方法小结

    1)func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true 示例如下: import ( "fmt" ...

  9. golang文件上传和下载

    [代码]golang 实现的文件服务(包括上传,下载的server端和client端) (2013-09-20 02:03:52) 转载▼ 标签: golang go 文件服务器 it 分类: GO相 ...

随机推荐

  1. ppt 数组课后作业

    任务要求:随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路:建一个数组,在for语句中将随机数存入数组中,然后每生成一个数就进行相加, ...

  2. zt:Linux查看程序端口占用情况

    http://www.cnblogs.com/benio/archive/2010/09/15/1826728.html yxr注: 由于安装eda工具libero,license要配端口,为确认端口 ...

  3. python基础知识---迭代器、生成器、装饰器

    一.迭代器 二.生成器 http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html def func(): #定义生成器,和普通函数的区别是 ...

  4. ---bind 配置

    http://blog.csdn.net/zjunjun/article/details/7419125

  5. iOS 解压打包静态库命令

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" } p.p2 { margin: 0.0px ...

  6. SQL Server 的表数据简单操作

    --表数据操作----添加表数据----向现有表添加数据--[use 要操作数据表的数据库名称go]insert [into] 数据表 [(字段名1,字段名2,字段名3, ...)] values(值 ...

  7. javascript照片墙效果

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. C语言 值传递和地址传递

    不少同学在学到C语言的指针部分时感到很困惑,对经常提到的"值传递"和"地址传递"两个概念弄不 明白.实际上,因为地址本身也可以作为一个特殊的"值&qu ...

  9. javascript 中的继承实现, call,apply,prototype,构造函数

    javascript中继承可以通过call.apply.protoperty实现 1.call call的含义: foo.call(thisObject, args...) 表示函数foo调用的时候, ...

  10. Unity Application 前后台切换调用关系

    [Unity Application 前后台切换调用关系] http://blog.csdn.net/aa4790139/article/details/48087877