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

web前端工程师是什么北京seo公司有哪些

web前端工程师是什么,北京seo公司有哪些,珠海华中建设工程有限公司网站,电器网站建设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://www.dtcms.com/wzjs/374505.html

相关文章:

  • 网上申请开办公司流程如何优化网络
  • 阜宁网站制作费用产品推广策划方案
  • 门户网站开发流程武汉seo服务多少钱
  • 个人网站怎么做的模板搜索引擎优化行业
  • 网站开发准备流程图常用的seo工具推荐
  • 网站怎么做分站湘潭网站设计
  • 网站企业网站建设需求文档广州网站设计实力乐云seo
  • 网站建设公司优势百度竞价开户3000
  • 百度站长平台官网死链提交定制开发公司
  • 网站建设实例教程做博客的seo技巧
  • 阿里云 cdn wordpressseo推广是什么工作
  • 洗化行业做网站最近中国新闻热点大事件
  • 网站集约化建设题目女教师遭网课入侵视频
  • 医疗整形网站怎么做做竞价托管的公司
  • 学习做网站的网站网上广告怎么推广
  • 陕西省建设厅网站查询南宁网站建设网站推广
  • 网站建设系统课程全网营销整合营销
  • 有关网站建设新闻资讯seo词库排行
  • 莲都区建设分局网站广州百度推广排名优化
  • 沈阳免费网站制作南宁seo教程
  • 邳州网站建设如何宣传推广
  • 代码家的干货网站seo教程seo入门讲解
  • 爱站seo工具包免费版seo搜索引擎优化书籍
  • 佛山市手机网站建设爱站网络挖掘词
  • 东莞市建设局网站seo日常优化内容是什么
  • 怎样注册.com网站营销失败案例分析
  • 电商导购网站开发seo外链工具有用吗
  • 企业建站项目长沙网站推广 下拉通推广
  • 下载wix做的网站搜索引擎成功案例分析
  • 定制网站设计高端网站建设福州百度seo代理