使用Go构建服务器

Server的结构如下:

type Server struct {
    Addr    string  // 网络地址,默认使用80端口
    Handler Handler // 处理器,若为空则默认使用http.DefaultServeMux这个实例

    TLSConfig *tls.Config

    ReadTimeout time.Duration

    ReadHeaderTimeout time.Duration

    WriteTimeout time.Duration

    IdleTimeout time.Duration

    MaxHeaderBytes int

    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)

    ConnState func(net.Conn, ConnState)

    ErrorLog *log.Logger

    disableKeepAlives int32     // accessed atomically.
    inShutdown        int32     // accessed atomically (non-zero means we're in Shutdown)
    nextProtoOnce     sync.Once // guards setupHTTP2_* init
    nextProtoErr      error     // result of http2.ConfigureServer if used

    mu         sync.Mutex
    listeners  map[net.Listener]struct{}
    activeConn map[*conn]struct{}
    doneChan   chan struct{}
    onShutdown []func()
}

构建一个简单的web服务器:

package main

import (
    "fmt"
    "net/http"
)

//定义一个处理器
type MyHandler struct{}

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "hello world!!!")

}

func main() {
    handler := MyHandler{}
    server := http.Server{
        Addr:    "0.0.0.0:8080",
        Handler: &handler,  //处理器没有路由功能,所有请求都是同样的回应
    }
    server.ListenAndServe()  //开启web服务
}

快速配置,根据网络地址和处理器开启web服务:

http.ListenAndServe(addr string, handler Handler) 

函数内部:

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}  //生成server实例
    return server.ListenAndServe()  //调用server.ListenAndServe()方法
}

http包有一个默认的多路复用器实例DefaultServeMux,当server成员Handler值为nil时,则默认使用DefaultServeMux。

猜你喜欢

转载自blog.csdn.net/weixin_42506905/article/details/81909236