副标题[/!--empirenews.page--]
1 概述
包 net/http 提供了HTTP服务器端和客户端的实现。本文说明关于服务器端的部分。
快速开始:
- package main
-
- import (
- "log"
- "net/http"
- )
-
- func main() {
- // 设置 路由
- http.HandleFunc("/", IndexAction)
-
- // 开启监听
- log.Fatal(http.ListenAndServe(":8888", nil))
- }
-
- func IndexAction(w http.ResponseWriter, r *http.Request) {
- w.Write([]byte(`<h1 align="center">来自小韩说课的问候</h1>`))
- }
运行程序,在浏览器上请求: localhost:8888,你会看到我们的结果:
Go语言构建HTTP服务器还是很容易的。深入说明。

2 http.Server 类型
HTTP 服务器在 Go 语言中是由 http.Server 结构体对象实现的。参考 http.ListenAndServe()的实现:
- // 文件:src/net/http/server.go
-
- // ListenAndServe always returns a non-nil error.
- func ListenAndServe(addr string, handler Handler) error {
- server := &Server{Addr: addr, Handler: handler}
- return server.ListenAndServe()
- }
可见过程是先实例化 Server 对象,再完成 ListenAndServe 。其中 Serve 对象就是表示 HTTP 服务器的对象。其结构如下:
- // 文件:src/net/http/server.go
-
- type Server struct {
- Addr string // TCP 监听地址, 留空为:":http"
- Handler Handler // 调用的 handler(路由处理器), 设为 nil 表示 http.DefaultServeMux
-
- TLSConfig *tls.Config // TLS 配置对象
- ReadTimeout time.Duration // 请求超时时长
- ReadHeaderTimeout time.Duration // 请求头超时时长
- WriteTimeout time.Duration // 响应超时时长
- IdleTimeout time.Duration // 请求空闲时长(keep-alive下两个请求间)
- MaxHeaderBytes int // 请求头的最大长度
- TLSNextProto map[string]func(*Server, *tls.Conn, Handler) // NPN 型协议升级出现时接管TLS连接的处理器函数映射表
- 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()
- }
可见 Server 定义了服务器需要的信息。
实例化了 Server 对象后,调用其 (srv *Server) ListenAndServe() error 方法。该方法会监听 srv.Addr 指定的 TCP 地址,并通过 (srv *Server) Serve(l net.Listener) error 方法接收浏览器端连接请求。Serve 方法会接收监听器 l 收到的每一个连接,并为每一个连接创建一个新的服务进程。
该 go 进程会读取请求,然后调用 srv.Handler 处理并响应。srv.Handler 通常会是 nil,这意味着需要调用 http.DefaultServeMux 来处理请求,这个 DefaultServeMux 是默认的路由,我们使用 http.HandleFunc 就是在 http.DefaultServeMux 上注册方法。
3 http.DefaultServeMux 默认路由对象
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|