当前位置: 首页 > wzjs >正文

999免费网站传奇哪里做网站比较号

999免费网站传奇,哪里做网站比较号,免费素材视频软件app,开发房地产需要多少钱GO语言学习(七) 上一期我们简单地带大家手把手实践一下利用GO来构建服务器,大家是不是很不接里面为啥是这样操作的,所以这一期我们就来带领大家一起学习这些是如何实现web的工作,了解其底层实现方式,任何语…

GO语言学习(七)

上一期我们简单地带大家手把手实践一下利用GO来构建服务器,大家是不是很不接里面为啥是这样操作的,所以这一期我们就来带领大家一起学习这些是如何实现web的工作,了解其底层实现方式,任何语言都是万变不离其宗。

首先我们得先理解这些概念:

  • Request:用户发送请求的消息,主要用于服务器来解析用户请求信息,包括post,个体,URL,cookie等消息
  • Response:服务器反馈给客户端的信息
  • Handler:用于处理请求和生成返回信息的逻辑处理信息
  • Conn:用户请求的链接(不具有延迟性)

这些基础知识理解了之后我们就来分析一下http包的运行处理机制:

  • 创建Listen Socket, 监听指定的端口, 等待客户端请求到来。
  • Listen Socket接受客户端的请求, 得到Client Socket, 接下来通过Client Socket与客户端通信。
  • 处理客户端的请求, 首先从Client Socket读取HTTP请求的协议头, 如果是POST方法, 还可能要读取客户端提交的数据, 然后交给相应的handler处理请求, handler处理完毕准备好客户端需要的数据, 通过Client Socket写给客户端。

实现了如上的一些都是通过Golang的net/http包来实现的,下面我们从代码角度来分析一下:

首先先定义一个监听函数:

func ListenAndServe(addr string, handler Handler) error {server := &Server{Addr: addr, Handler: handler}return server.ListenAndServe()
}

这个ListenAndServe函数会初始化一个sever对象,然后调用了Server对象的方法ListenAndServe实现功能,代码如下:

func (srv *Server) ListenAndServe() error {if srv.shuttingDown() {return ErrServerClosed}addr := srv.Addrif addr == "" {addr = ":http"}ln, err := net.Listen("tcp", addr)if err != nil {return err}return srv.Serve(ln)
}

这个ListenAndServe调用了net.Listen("tcp", addr),也就是底层用TCP协议(起到链接的作用)搭建了一个服务,最后调用src.Serve监控我们设置的端口,然后我们是如何接收客户端的请求又要用到下面的方法来实现,代码如下:

func (srv *Server) Serve(l net.Listener) error {...ctx := context.WithValue(baseCtx, ServerContextKey, srv)for {rw, err := l.Accept()...connCtx := ctxif cc := srv.ConnContext; cc != nil {connCtx = cc(connCtx, rw)if connCtx == nil {panic("ConnContext returned nil")}}tempDelay = 0c := srv.newConn(rw)c.setState(c.rwc, StateNew, runHooks) // before Serve can returngo c.serve(connCtx)}
}
func (c *conn) serve(ctx context.Context) {...ctx, cancelCtx := context.WithCancel(ctx)c.cancelCtx = cancelCtxdefer cancelCtx()c.r = &connReader{conn: c}c.bufr = newBufioReader(c.r)c.bufw = newBufioWriterSize(checkConnErrorWriter{c}, 4<<10)for {w, err := c.readRequest(ctx)...// HTTP cannot have multiple simultaneous active requests.[*]// Until the server replies to this request, it can't read another,// so we might as well run the handler in this goroutine.// [*] Not strictly true: HTTP pipelining. We could let them all process// in parallel even if their responses need to be serialized.// But we're not going to implement HTTP pipelining because it// was never deployed in the wild and the answer is HTTP/2.serverHandler{c.server}.ServeHTTP(w, w.req)w.cancelCtx()...}
}

解释一下上面的两段代码,从头到尾仔细看,这个对你理解构建请求服务十分重要:

这个函数里面起了一个for{},首先通过Listener接收请求:l.Accept(),其次创建一个Conn:c := srv.newConn(rw),最后单独开了一个goroutine,把这个请求的数据当做参数扔给这个conn去服务:go c.serve(connCtx)。这个就是高并发体现了,用户的每一次请求都是在一个新的goroutine去服务,相互不影响。conn首先会解析request:w, err := c.readRequest(ctx), 然后获取相应的handler去处理请求:serverHandler{c.server}.ServeHTTP(w, w.req),ServeHTTP的具体实现如下:

在这个中我为大家列出ServeHTTP具体实现过程:

func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {handler := sh.srv.Handlerif handler == nil {handler = DefaultServeMux}if req.RequestURI == "*" && req.Method == "OPTIONS" {handler = globalOptionsHandler{}}handler.ServeHTTP(rw, req)
}

解释这个sh.srv.Handler说白了就是我们刚才在调用函数ListenAndServe时候的第二个参数,我们前面例子传递的是nil,也就是为空,那么默认获取handler = DefaultServeMux,那么这个变量用来做什么的呢?对,这个变量就是一个路由器,它用来匹配url跳转到其相应的handle函数,那么这个我们有设置过吗?有,我们调用的代码里面第一句不是调用了http.HandleFunc("/", sayhelloName)嘛。这个作用就是注册了请求/的路由规则,当请求uri为"/",路由就会转到函数sayhelloName,DefaultServeMux会调用ServeHTTP方法,这个方法内部其实就是调用sayhelloName本身,最后通过写入response的信息反馈到客户端。

通过这期内容大家是不是基本掌握了web开发的核心逻辑,是不是更加理解其底层实现,大家有啥不懂的欢迎各位在评论区讨论,下一期将会更加细致的帮助各位理解http的实现原理,带你剖析它的底层逻辑,请各位持续关注,谢谢各位友友们了。


文章转载自:

http://JhHMmFSm.jtybL.cn
http://JztUsLI4.jtybL.cn
http://T0iBA5cW.jtybL.cn
http://khEJR8g8.jtybL.cn
http://jOSVdnLN.jtybL.cn
http://u4mZpVQU.jtybL.cn
http://hiMG1U97.jtybL.cn
http://mhaxdO2N.jtybL.cn
http://si9gKdYZ.jtybL.cn
http://rjLl00XS.jtybL.cn
http://vrLBBW1J.jtybL.cn
http://MrLbLdP1.jtybL.cn
http://sED0KtSV.jtybL.cn
http://Serm5exR.jtybL.cn
http://4EFG8ycc.jtybL.cn
http://iN31xe2O.jtybL.cn
http://Ow42cBod.jtybL.cn
http://aNvRv62a.jtybL.cn
http://9r3PeBJh.jtybL.cn
http://gVZqLiRS.jtybL.cn
http://qvGCvAiY.jtybL.cn
http://XNqFN2Pb.jtybL.cn
http://Wa2fpb0f.jtybL.cn
http://VOO9v8Lx.jtybL.cn
http://4l8pbnv5.jtybL.cn
http://ZtoGTVWY.jtybL.cn
http://7HCO7gJs.jtybL.cn
http://CJu536Mi.jtybL.cn
http://TDOIPYg3.jtybL.cn
http://fx7p74UB.jtybL.cn
http://www.dtcms.com/wzjs/763880.html

相关文章:

  • 卓越亚马逊网站建设目的wordpress ip改成域名
  • wordpress企业主题二次开发下载优化软件
  • 广西旅游网站建设检查网站的死链接
  • 我和你99谁做的网站做网站的必要性
  • 网络调查问卷在哪个网站做我的网站模板下载 迅雷下载 迅雷下载
  • 做美食网站的模板外包公司名单
  • 做外贸仿牌网站seo网站优化课程
  • 网站和域名区别吗Wordpress is文章展示
  • 北京网站设计制作教程个人网站设计策划
  • 在国外做盗版网站关键词排名优化
  • 闵行手机网站建设微建站平台
  • 内蒙古网站建站php企业公司网站源码
  • 长宁做网站价格蓝色 宽屏 网站 模板下载
  • 宁波网站优化公司推荐win7优化设置
  • 国家建设部网站倪虹公司快速建站
  • 2015年做那个网站致富米拓网站建设教程
  • 做交网站建设部一建注册公示网站
  • 企业网站案例分析做网站怎么做
  • 网站失败的原因手机app软件开发机构
  • 深圳建站公司专业公司广告优化师
  • 网站建设情况说明总结小橡皮私人定制app软件
  • 青岛李沧建设局网站网站做好了前端 后端怎么做
  • 如何购买网站虚拟主机沈阳网站关键词排名
  • 曲靖网站制作公司阜新网站seo
  • 成都网站建设爱特通携程网站建设状况
  • 现在网站给源码企业做网站需要注意什么问题
  • 东莞网站建设在线推广成都培训网站建设
  • 服装品牌网站开发phpwordpress界面404
  • 建设公司资质查询官网廊坊视频优化排名
  • 网站上传该怎么做网站前端工资