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

做淘宝需要知道什么网站怎么做一个网站平台

做淘宝需要知道什么网站,怎么做一个网站平台,软件介绍网站模板,soho网站建设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/359601.html

相关文章:

  • 做的网站没有注册百度q3财报减亏170亿
  • 大型的网站建设360网站推广怎么做
  • 京东商城网站建设目标今天新闻摘抄十条
  • 网站会员体系想要推广页
  • 重庆网站开发公司广州seo技术优化网站seo
  • 做网站能收多少广告费天津seo标准
  • 广州网站建设哪家靠谱域名关键词排名查询
  • 南城微网站建设全网优化推广
  • 网站建设的威胁友情链接格式
  • 张掖市建设规划局网站营销咨询公司经营范围
  • wordpress 怎么改中文字体百度seo关键词工具
  • 福州市市政建设开发有限公司网站百度快照推广有效果吗
  • 南京华夏天成建设有限公司网站选择一个产品做营销方案
  • 网站建设关键字小程序推广接单平台
  • 昆明网站设计建设网络营销推广外包平台
  • 有开源项目做的网站站长工具app
  • 办公室装修费用会计分录上海aso苹果关键词优化
  • 深圳微信网站建设报价查网站权重
  • 石首建设局网站营销型网站建设解决方案
  • 公司网站代做合肥seo招聘
  • 做pc端软件可以参考那些网站无锡网站制作推广
  • 吴江手机网站建设价格网络营销的理解
  • 柳州360优化优化网站排名方法
  • 怎么做网页中不显示项目符号seo必备工具
  • 网站原型图设计软件百度联盟是什么
  • 小说网站充值接口怎么做的sem推广托管公司
  • 日本代购网站怎么做的电脑优化大师下载安装
  • 广州做啊里巴巴网站多少钱上海百度推广开户
  • 西安分销商城网站建设阿里巴巴国际站运营
  • 建设公共网站的目的云南网站建设百度