一、go自带net/http处理 http接口的应用
func main() {
// 注册路由
http.HandleFunc("/", func(write http.ResponseWriter, request *http.Request) {
_, _ = write.Write([]byte("Hello World!"))
})
// 服务监听
if err := http.ListenAndServe(":8080", nil); err != nil{
fmt.Println("start http server fail:", err)
}
}
http.HandleFunc 实际就是将路由注册进 DefaultServeMux(默认多路复用器)
http.ListenAndServe 实际就是监听TCP网络地址addr,并调用serveer处理handler及返回响应
handler为nil时默认使用DefaultServeMux,addr为空时默认使用”:http"
srv.Serve(ln)
c.serve(connCtx)
整体过程
1、ln, err := net.Listen("tcp", addr) 初试化了socket, bind, listen
2、rw, e := l.Accept() 进行accept, 等待客户端进行连接
3、go c.serve(ctx) 启动新goroutine来处理本次请求. 同时主goroutine继续等待客户端连接, 进行高并发操作
4、h, _ := mux.Handler(r) 获取注册的路由, 拿到这个路由的handler, 然后将处理结果返回给客户端
二、net/http是如何建立socket的
1、http(应用层)是基于TCP协议(传输层)实现的,TCP协议是可靠的传输协议通过三次握手和四次挥手来进行连接和断开。
2、服务器 需进行 bind,listen,accept 三个阶段来建立链接。