日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go如何使web工作

發布時間:2025/6/15 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go如何使web工作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

web工作方式的幾個概念

以下均是服務器端的幾個概念

Request:用戶請求的信息,用來解析用戶的請求信息,包括post、get、cookie、url等信息

Response:服務器需要反饋給客戶端的信息

Conn:用戶的每次請求鏈接

Handler:處理請求和生成返回信息的處理邏輯

分析http包運行機制

  • 創建Listen Socket, 監聽指定的端口, 等待客戶端請求到來。

  • Listen Socket接受客戶端的請求, 得到Client Socket, 接下來通過Client Socket與客戶端通信。

  • 處理客戶端的請求, 首先從Client Socket讀取HTTP請求的協議頭, 如果是POST方法, 還可能要讀取客戶端提交的數據, 然后交給相應的handler處理請求, handler處理完畢準備好客戶端需要的數據, 通過Client Socket寫給客戶端。

  • 這整個的過程里面我們只要了解清楚下面三個問題,也就知道Go是如何讓Web運行起來了

    • 如何監聽端口?
    • 如何接收客戶端請求?
    • 如何分配handler?

    前面小節的代碼里面我們可以看到,Go是通過一個函數ListenAndServe來處理這些事情的,這個底層其實這樣處理的:初始化一個server對象,然后調用了net.Listen("tcp", addr),也就是底層用TCP協議搭建了一個服務,然后監控我們設置的端口。

    下面代碼來自Go的http包的源碼,通過下面的代碼我們可以看到整個的http處理過程:

    func (srv *Server) Serve(l net.Listener) error {defer l.Close()var tempDelay time.Duration // how long to sleep on accept failurefor {rw, e := l.Accept()if e != nil {if ne, ok := e.(net.Error); ok && ne.Temporary() {if tempDelay == 0 {tempDelay = 5 * time.Millisecond} else {tempDelay *= 2}if max := 1 * time.Second; tempDelay > max {tempDelay = max}log.Printf("http: Accept error: %v; retrying in %v", e, tempDelay)time.Sleep(tempDelay)continue}return e}tempDelay = 0c, err := srv.newConn(rw)if err != nil {continue}go c.serve()} }

    監控之后如何接收客戶端的請求呢?上面代碼執行監控端口之后,調用了srv.Serve(net.Listener)函數,這個函數就是處理接收客戶端的請求信息。這個函數里面起了一個for{},首先通過Listener接收請求,其次創建一個Conn,最后單獨開了一個goroutine,把這個請求的數據當做參數扔給這個conn去服務:go c.serve()。這個就是高并發體現了,用戶的每一次請求都是在一個新的goroutine去服務,相互不影響。

    那么如何具體分配到相應的函數來處理請求呢?conn首先會解析request:c.readRequest(),然后獲取相應的handler:handler := c.server.Handler,也就是我們剛才在調用函數ListenAndServe時候的第二個參數,我們前面例子傳遞的是nil,也就是為空,那么默認獲取handler = DefaultServeMux,那么這個變量用來做什么的呢?對,這個變量就是一個路由器,它用來匹配url跳轉到其相應的handle函數,那么這個我們有設置過嗎?有,我們調用的代碼里面第一句不是調用了http.HandleFunc("/", sayhelloName)嘛。這個作用就是注冊了請求/的路由規則,當請求uri為"/",路由就會轉到函數sayhelloName,DefaultServeMux會調用ServeHTTP方法,這個方法內部其實就是調用sayhelloName本身,最后通過寫入response的信息反饋到客戶端。

    總結

    以上是生活随笔為你收集整理的go如何使web工作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。