zoukankan      html  css  js  c++  java
  • Go语言实现简单的一个静态WEB服务器

    package main
    
    import (
        "net/http"
    )
    
    func main() {
        http.Handle("/", http.FileServer(http.Dir("./www/")))
        http.ListenAndServe(":8123", nil)
    }

    在生成的EXE文件所在目录中创建www子目录,在该目录中放web静态文件。

    以上是静态文件使用http.FileServer,那么动态文件则用http.HandleFunc

    参考http://www.cnblogs.com/yjf512/archive/2012/09/03/2668384.html

    或http://studygolang.com/articles/4105

    或参考以下代码

    package main
    
    import (
        "bytes"
        "expvar"
        "flag"
        "fmt"
        "io"
        "log"
        "net/http"
        "os"
        "os/exec"
        "strconv"
        "sync"
    )
    
    // hello world, the web server
    var helloRequests = expvar.NewInt("hello-requests")
    
    func HelloServer(w http.ResponseWriter, req *http.Request) {
        helloRequests.Add(1)
        io.WriteString(w, "hello, world!
    ")
    }
    
    // Simple counter server. POSTing to it will set the value.
    type Counter struct {
        mu sync.Mutex // protects n
        n  int
    }
    
    // This makes Counter satisfy the expvar.Var interface, so we can export
    // it directly.
    func (ctr *Counter) String() string {
        ctr.mu.Lock()
        defer ctr.mu.Unlock()
        return fmt.Sprintf("%d", ctr.n)
    }
    
    func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        ctr.mu.Lock()
        defer ctr.mu.Unlock()
        switch req.Method {
        case "GET":
            ctr.n++
        case "POST":
            buf := new(bytes.Buffer)
            io.Copy(buf, req.Body)
            body := buf.String()
            if n, err := strconv.Atoi(body); err != nil {
                fmt.Fprintf(w, "bad POST: %v
    body: [%v]
    ", err, body)
            } else {
                ctr.n = n
                fmt.Fprint(w, "counter reset
    ")
            }
        }
        fmt.Fprintf(w, "counter = %d
    ", ctr.n)
    }
    
    // simple flag server
    var booleanflag = flag.Bool("boolean", true, "another flag for testing")
    
    func FlagServer(w http.ResponseWriter, req *http.Request) {
        w.Header().Set("Content-Type", "text/plain; charset=utf-8")
        fmt.Fprint(w, "Flags:
    ")
        flag.VisitAll(func(f *flag.Flag) {
            if f.Value.String() != f.DefValue {
                fmt.Fprintf(w, "%s = %s [default = %s]
    ", f.Name, f.Value.String(), f.DefValue)
            } else {
                fmt.Fprintf(w, "%s = %s
    ", f.Name, f.Value.String())
            }
        })
    }
    
    // simple argument server
    func ArgServer(w http.ResponseWriter, req *http.Request) {
        for _, s := range os.Args {
            fmt.Fprint(w, s, " ")
        }
    }
    
    // a channel (just for the fun of it)
    type Chan chan int
    
    func ChanCreate() Chan {
        c := make(Chan)
        go func(c Chan) {
            for x := 0; ; x++ {
                c <- x
            }
        }(c)
        return c
    }
    
    func (ch Chan) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        io.WriteString(w, fmt.Sprintf("channel send #%d
    ", <-ch))
    }
    
    // exec a program, redirecting output
    func DateServer(rw http.ResponseWriter, req *http.Request) {
        rw.Header().Set("Content-Type", "text/plain; charset=utf-8")
    
        date, err := exec.Command("/bin/date").Output()
        if err != nil {
            http.Error(rw, err.Error(), 500)
            return
        }
        rw.Write(date)
    }
    
    func Logger(w http.ResponseWriter, req *http.Request) {
        log.Print(req.URL)
        http.Error(w, "oops", 404)
    }
    
    var webroot = flag.String("root", os.Getenv("HOME"), "web root directory")
    
    func main() {
        flag.Parse()
    
        // The counter is published as a variable directly.
        ctr := new(Counter)
        expvar.Publish("counter", ctr)
        http.Handle("/counter", ctr)
        http.Handle("/", http.HandlerFunc(Logger))
        http.Handle("/go/", http.StripPrefix("/go/", http.FileServer(http.Dir(*webroot))))
        http.Handle("/chan", ChanCreate())
        http.HandleFunc("/flags", FlagServer)
        http.HandleFunc("/args", ArgServer)
        http.HandleFunc("/go/hello", HelloServer)
        http.HandleFunc("/date", DateServer)
        err := http.ListenAndServe(":12345", nil)
        if err != nil {
            log.Panicln("ListenAndServe:", err)
        }
    }

    curl http://localhost:12345/counter

    curl http://localhost:12345/

    curl http://localhost:12345/go

    curl http://localhost:12345/chan

    curl http://localhost:12345/flags

    curl http://localhost:12345/args

    curl http://localhost:12345/go/hello

    curl http://localhost:12345/date

    curl http://localhost:12345/xx

  • 相关阅读:
    CodeForces 203C Photographer
    CodeForces 190A Vasya and the Bus
    CodeForces 187A Permutations
    Zoj3762 等待解决
    LA4080最短路树的应用
    uva10917 dij单源最短路预处理+构造新图(DAG)+求图上路径数
    uva11374 dij单源最短路+枚举
    LA3713 2-sat(用到两种矛盾关系)
    【算法总结】2-sat中对象的5种矛盾关系及其连边方式
    LA3211二分答案+2-sat+总结的此类问题统一建模方法
  • 原文地址:https://www.cnblogs.com/pu369/p/5899198.html
Copyright © 2011-2022 走看看