• 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
  • 相关阅读:
    paip.验证码识别使用字符集的选取
    paip.提升用户体验业务SQL注入漏洞的分析与解决
    人人网验证码识别
    paip.路由器拨号上网密码找回.txt
    PAIP.ASP技术手册
    PAIP.java程序调试的注意点及流程总结
    paip.XXListener is already configured监听器已经被配置的解决
    paip.目录文件列表排序算法
    paip.C#.net TIMER不起作用在用户控件中
    paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
  • 原文地址:https://www.cnblogs.com/uptothesky/p/8585894.html
Copyright © 2020-2023  润新知