zoukankan      html  css  js  c++  java
  • go http.Handler

    http1

    package main
    
    import (
        "log"
        "net/http"
        "fmt"
    )
    
    func main() {
        db:=database{"shoes":50,"socks":5}
        log.Fatal(http.ListenAndServe("localhost:5000",db))
    }
    type dollars float32
    
    func (d dollars) String() string {
        return fmt.Sprintf("$%.2f",d)
    }
    type database map[string]dollars
    
    func (db database) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        for item,price:=range db{
            fmt.Fprintf(w,"%s: %s
    ",item,price)
        }
    }
    View Code

    打开浏览器:http://localhost:5000/

     

     http2

    package main
    
    import (
        "fmt"
        "net/http"
        "log"
    )
    
    func main() {
        db:=database{"shoes":50,"socks":5}
        mux:=http.NewServeMux()
        mux.Handle("/list",http.HandlerFunc(db.list))
        mux.Handle("/price",http.HandlerFunc(db.price))
        log.Fatal(http.ListenAndServe("localhost:5000",mux))
    }
    type database map[string]dollars
    type dollars float32
    
    func (d dollars) String() string {
        return fmt.Sprintf("$%.2f",d)
    }
    func (db database) list(w http.ResponseWriter, req *http.Request) {
        for item,price:=range db{
            fmt.Fprintf(w,"%s: %s
    ",item,price)
        }
    }
    func (db database) price(w http.ResponseWriter,req *http.Request)  {
        item:=req.URL.Query().Get("item")
        price,ok:=db[item]
        if !ok{
            w.WriteHeader(http.StatusNotFound)
            fmt.Fprintf(w,"no such item: %q
    ",item)
            return
        }
        fmt.Fprintf(w,"%s
    ",price)
    }
    View Code

    打开浏览器:http://localhost:5000/price?item=socks

     clock1

    package main
    
    import (
        "net"
        "io"
        "time"
        "log"
    )
    
    func main() {
        listener,err:=net.Listen("tcp","localhost:8000")
        if err!=nil{
            log.Fatal(err)
        }
        for{
            conn,err:=listener.Accept()
            if err!=nil{
                log.Print(err)
                continue
            }
            handleConn(conn)
        }
    }
    
    func handleConn(c net.Conn) {
        defer c.Close()
        for{
            _,err:=io.WriteString(c,time.Now().Format("15:04:05
    "))
            if err!=nil{
                return
            }
            time.Sleep(1*time.Second)
        }
    }
    View Code

    运行clock1,打开cmd,使用telnet localhost 8000 进行连接

     或者使用下面的程序

    netcat1

    package main
    
    import (
        "io"
        "log"
        "net"
        "os"
    )
    
    func main() {
        conn,err:=net.Dial("tcp","localhost:8000")
        if err!=nil{
            log.Fatal(err)
        }
        defer conn.Close()
        mustCopy(os.Stdout,conn)
    }
    
    func mustCopy(dst io.Writer, src io.Reader) {
        if _,err:=io.Copy(dst,src);err!=nil{
            log.Fatal(err)
        }
    }
    View Code

    为了让服务器支持并发,只需要在handleConn上添加一个go

    clock2

        for{
            conn,err:=listener.Accept()
            if err!=nil{
                log.Print(err)
                continue
            }
            go handleConn2(conn)
        }
    View Code
  • 相关阅读:
    C#遍历访问Dictionary和HashTable
    SQL:select case when(转)
    微软四大名著
    中国 Erlounge III 归来,好消息一箩筐!
    原来,程序的世界远比我想象的精彩
    Google和Yahoo专家联手揭秘世界顶尖公司的技术内幕
    有意义,不容易!(一位译者的翻译感言)
    世界级Oracle专家权威力作
    国内第一部DWR著作
    SQL Server故障排除圣经
  • 原文地址:https://www.cnblogs.com/uptothesky/p/8585894.html
Copyright © 2011-2022 走看看