net/http
1.对于普通的上网过程:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器回去请求DNS服务器,通过DNS获取相应的域名对应的IP,然后通过IP地址找到IP对应的服务器,要求建立TCP连接,等浏览器发啊送完HTTP REQUEST包后,服务器接收到请求包之后开始处理请求包,服务器调用资深服务,返回HTTP RESPONSE包,客户端收到来自服务器的相应后开始渲染这个RESPONSE包里的主体(body),等收到全部的内容之后断开与该服务器之间的TCP连接
2.一个WEB服务器也被称为HTTP服务器
工作原理如下
-
客户机通过TCP/IP协议建立到服务器的TCP连接
-
客户端向服务器发送HTTP协议请求包 请求服务器里的资源文档
-
服务器向客户机发送HTTP协议应答包
-
客户端与服务器断开,由客户端解释HTML文档,在客户端屏幕上渲染图形结果
3.net/http实现一个简单的服务器
package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayhelloName (w http.ResponseWriter,r *http.Request) {
r.ParseForm() //解析参数 默认不解析
fmt.Println(r.Form) //输出到服务器端的打印信息
fmt.Println("path:",r.URL.Path)
fmt.Println("scheme:",r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k,v:=range r.Form{
fmt.Println("key:",k)
fmt.Println("val:",strings.Join(v,""))
}
fmt.Fprintf(w,"Hello xiaocheng") //写入到客户端
}
func main() {
http.HandleFunc("/",sayhelloName) //设置访问的路由
err := http.ListenAndServe(":9090", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
4.go如何使得web工作
web工作方式:
-
request:用户请求的信息,用来解析用户请求内容,包括post get cookie url等内容
-
response:服务器需要反馈给客户端的内容
-
conn:客户端和服务器之间的连接
-
handler:处理请求和生成返回信息的处理逻辑
http的执行流程
-
创建listen socket 监听指定的端口,等待客户端请求到来
-
socket接受客户端的请求,得到client socket,接下来通过client socket与客户端通信
-
处理客户端的请求,首先从client socket读取HTTP请求的协议头 然后交给相应的handler处理请求
func ListenAndServe(addr string,handler Handler) error {
server:=&Server{Addr:addr,Handler:handler}
return server.ListenAndServe()
}
func (srv *Server) ListenAndServe() error {
if srv.shuttingDown() {
return ErrServerClosed
}
addr := srv.Addr
if addr == "" {
addr = ":http"
}
ln, err := net.Listen("tcp", addr) //tcp监听端口
if err != nil {
return err
}
return srv.Serve(ln)
}
func (srv *Server) Serve(l net.Listener) error {
...
ctx := context.WithValue(baseCtx, ServerContextKey, srv)
for {
rw, err := l.Accept()
...
connCtx := ctx
if cc := srv.ConnContext; cc != nil {
connCtx = cc(connCtx, rw)
if connCtx == nil {
panic("ConnContext returned nil")
}
}
tempDelay = 0
c := srv.newConn(rw)
c.setState(c.rwc, StateNew, runHooks) // before Serve can return
go c.serve(connCtx)
}
}
5.Conn的goroutine
go为了实现高并发,使用协程来处理conn的读写时间,保持每个请求的独立性和高效性
c, err := srv.newConn(rw)
if err != nil {
continue
}
go c.serve()
6.还有一些常用的包API,但是一般不用原生net/http包写web服务,这边就跳过了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!