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

学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. WIn7系统下 打开.exe程序出现已停止工作关闭程序之解决办法

    新装WIN7系统出现  .NET组建没有安装  可到官网下载安装 NETFx4.0 运行MVB 上位机SIM.EXE出现应用程序已停止工作问题 解决办法: 需关闭WIN7 DEP  如下 开始-运行( ...

  2. VUE 入门笔记

    前端的MVVM概念今年来也算是如火如荼,了解完 MVVM的概念,也该找个去尝试下 首先我先试了下 国内小而美的 VUE 试着照着文档敲出入门文件,内容都在注释里 <!doctype html&g ...

  3. Data Transformation / Learning with Counts

    机器学习中离散特征的处理方法 Updated: August 25, 2016 Learning with counts is an efficient way to create a compact ...

  4. [MAC]2015款MACBOOK使用BOOTCAMP安装WIN8.1+多分区

    注意事项: 2013年以前,带光驱的,请使用WinClone安装WIN7或WIN8,或可使用BOOTCAMP制作WINDOWS安装光盘 13-14年,不带光驱的,也能使用WinClone安装WIN7和 ...

  5. Java泛型-内部原理: 类型擦除以及类型擦除带来的问题

    一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...

  6. jsPlumb的简单使用

    jsPlumb概述jsPlumb是一个在dom元素之间绘制连接线的javascript框架,它使用svg技术绘制连接线. 基本概念很明显,一个连线主要要解决的问题包括谁和谁连,在哪里连(连接点在哪里) ...

  7. javascript验证香港身份证

    var assert = require('assert'); describe('test', function() { it('coc', function() { var testCard01 ...

  8. CentOS平台部署vsftp(基于虚拟用户)

    1. 安装FTP 1 2 [root@task ~]# yum install vsftpd –y [root@task ~]# chkconfig vsftpd on          # 配置开机 ...

  9. Android Studio tips1

    Android Studio 真机测试出现  device can not found 1.安装与手机版本一样的sdk 2.(重要!!)手机的驱动在电脑上没有正确的安装,安装豌豆荚可以解决!

  10. ruby 简介

    Ruby 是一个注重均衡的语言,它的发明者松本行弘 Yukihiro “Matz” Matsumoto,混合了他喜欢的语言(Perl. Smalltalk. Eiffel. Ada 和 Lisp ) ...