1. 程式人生 > >Go語言 簡單的http伺服器示例

Go語言 簡單的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    : [email protected]
*/
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訪問: