zoukankan      html  css  js  c++  java
  • Go语言实现http共享(总结)

    go语言入门简单,可要写出好的go代码得需要下些功夫。

    前两天刚把http文件共享的升级过(http://www.cnblogs.com/MikeZhang/archive/2012/08/06/httpShareGolang20120805.html ),现在经大牛指点完全用http实现,感觉爽快多了。 

    一个简单的http服务器代码 

    package main
    import (
            "io"
            "net/http"
            "log"
    )
    func HelloServer(w http.ResponseWriter, req *http.Request) {
            io.WriteString(w, "hello, world!\n")
    }
    func main() {
            http.HandleFunc("/hello", HelloServer)
            err := http.ListenAndServe(":12345", nil)
            if err != nil {
                    log.Fatal("ListenAndServe: ", err)
            }
    } 

    这里调用的是 http.HandleFunc函数,这个函数声明如下: 

    func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 

    这里用HelloServer实现HandleFunc函数的第二个参数。 

    一个简单的http服务器计数器程序代码 

    package main
    import (
            "fmt"
            "net/http"
            "log"
    )
    type Counter struct {
            n int
    }
    func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) {
          ctr.n++
          fmt.Fprintf(c, "counter = %d\n", ctr.n)
    }
    func main() {
            http.Handle("/counter", new(Counter))
            log.Fatal("ListenAndServe: ", http.ListenAndServe(":12345", nil))
    } 

    这里调用的是http.Handle函数,这个函数声明如下: 

    func Handle(pattern string, handler Handler) 

    说明:几乎任何东西都可加以方法,几乎任何东西都可满足某界面,http包定义的Handler界面就是这样,任何物件实现了Handler都可服务 HTTP请求。 

    type Handler interface { 

    ServeHTTP(ResponseWriter, *Request) 

    } 

    ResponseWriter 本身是个界面,它提供一些可访问的方法来返回客户的请求。这些方法包括标准的 Write 方法。因此 http.ResponseWriter 可用在io.Writer 可以使用的地方。Request 是个结构,包含客户请求的一个解析过的表示。 

    所以这里只要给 Counter实现ServeHTTP方法就可以服务HTTP请求了。 

    上面的两个例子是http服务器的两种方式,写出来主要是为了对比下。 

    两种方式都实现了类似这样的函数: handler func(ResponseWriter, *Request),但是第一个例子的函数名字不固定,可以随便起,第二个例子中的函数名字只能是ServeHTTP,其它的不行。

    实现http文件共享 

    文件服务器要用到 http.FileServer提供的Handler,下面的代码就是基于第二种方式实现的。这里就不多解释了,不懂的参考上面的例子,比较下或许有帮助。 

    源代码如下: 

    /*
    File      : httpShareWithTrace.go
    Author    : Mike
    E-Mail    : Mike_Zhang@live.com
    */
    package main
    import (
        "net/http"
        "os"
        "strings"
        "log"
    )
    type TraceHandler struct {
        h http.Handler
    }
    func (r TraceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
            println("get",req.URL.Path," from ",req.RemoteAddr)
            r.h.ServeHTTP(w, req)
    }
    func main() {
            port := "8080"//Default port 
            if len(os.Args)>1 { port = strings.Join(os.Args[1:2],"")}
            h := http.FileServer(http.Dir("."))
            http.Handle("/", TraceHandler{h})
            println("Listening on port ",port,"...")
            log.Fatal("ListenAndServe: ", http.ListenAndServe(":"+port, nil))
    }
    

    启动应用程序: 

     Web访问: 

     

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
查看全文
  • 相关阅读:
    Hash基础相关知识点总结
    Java程序员简历模板
    nginx中C语言操作技巧学习
    C标准库中转换wchar_t和char类型的字符串
    golang中接口interface和struct结构类的分析
    oracle 使用occi方式 批量插入多条数据
    oracle 使用occi方式插入数据时中文乱码
    在linux下监控文件是否被删除或创建的命令
    QT 中设置按钮图片和文字的两种方法
    Windows操作系统下 使用c++ WIN32API禁用控制台最小化和关闭按钮
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/httpShareGolang20120809.html
  • Copyright © 2011-2022 走看看