作家
登录

Go语言HTTP Server源码分析

作者: 来源: 2017-04-10 15:04:23 阅读 我要评论

fn := testHookServerServe; fn != nil { fn(srv, l) } var tempDelay time.Duration // how long to sleep>if err := srv.setupHTTP2_Serve(); err != nil { return err } srv.trackListener(l, true) defer srv.trackListener(l, false) baseCtx := context.Background() // base is always background, per Issue 16220 ctx := context.WithValue(baseCtx, ServerContextKey, srv) ctx = context.WithValue(ctx, LocalAddrContextKey, l.Addr()) //开启轮回进行监听 for { //经由过程Listener的Accept办法用来获取连接数据 rw, e := l.Accept() if e != nil { select { case <-srv.getDoneChan(): return ErrServerClosed default: } 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 } srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay) time.Sleep(tempDelay) continue } return e } tempDelay = 0 //经由过程获得的连接数据,创建newConn连接对象 c := srv.newConn(rw) c.setState(c.rwc, StateNew) // before Serve can return //开启goroutine发送连接请求 go c.serve(ctx) }}

serve()为核心,攫取对应的连接数据进行分派

func (c *conn) serve(ctx context.Context) {    c.remoteAddr = c.rwc.RemoteAddr().String()        //连接封闭相干的处理    defer func() {        if err := recover(); err != nil && err != ErrAbortHandler {            const size = 64 << 10            buf := make([]byte, size)            buf = buf[:runtime.Stack(buf, false)]            c.server.logf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf)        }        if !c.hijacked() {            c.close()            c	
				
			

  推荐阅读

  Linux命令行工具使用小贴士及技巧(三)

在这个系列的第一部分,我们具体地评论辩论了 cd - 敕令,在第二部分,我们深刻商量了 pushd 和 popd 两个敕令,以及它们应用的场景。持续对敕令行的评论辩论,在这篇教程中,我们将会经由>>>详细阅读


本文标题:Go语言HTTP Server源码分析

地址:http://www.17bianji.com/lsqh/34685.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)