广告
返回顶部
首页 > 资讯 > 精选 >Go语言网络编程与Http源码分析
  • 633
分享到

Go语言网络编程与Http源码分析

2023-07-05 17:07:53 633人浏览 薄情痞子
摘要

这篇文章主要介绍“Go语言网络编程与Http源码分析”,在日常操作中,相信很多人在Go语言网络编程与Http源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程与Http源码分析”的疑惑有所

这篇文章主要介绍“Go语言网络编程Http源码分析”,在日常操作中,相信很多人在Go语言网络编程与Http源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程与Http源码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    网络分层

    这块知识属于计算机网络,可以直接去看书。

    我们这里直接上图:

    Go语言网络编程与Http源码分析

    我们最常讲的是五层协议,最重要的是运输层和应用层,这两层是大多数情况下,工程师可以在代码中可以直接干预的模块,我们大多数的网络编程调优,就是在调这些协议的一些参数和细节。这两层的情况:

    • 运输层协议:tcp和UDP。

    • 应用层协议:Http,SMTP,FTP,websocket等等,这些协议需要使用运输层协议作为依托。

    引申,需要注意TCP和UDP的区别,和他们具体的使用场景。

    顺便提一句,网络分层本质上也是我们反复提过得加一层的思想,也是高内聚低耦合的一种具体的实现。

    进程间通信(IPC)

    这块知识属于操作系统,注意不是linux操作系统,还牵扯一点计算机组成原理的知识。

    IPC 是 Inter-Process Communication 的缩写,可以被翻译为进程间通信。主要方法有: 系统信号(signal)、管道(pipe)、套接字 (Socket)、文件(file lock)、消息队列(message queue)、信号量(semaphore)等。最常用的是系统信号,套接字,还有一个叫共享内存的,能实现,但不提倡。Go底层的os包里也包含着这些常用的方法。

    这里需要再引申下,操作系统中进程和线程是什么,协程又是什么。进程间是如何通信的,线程间又是如何通信的。

    我们单独把socket拎出来说,因为在众多方案中,就属它比较通用,比较灵活:使用socket可以跨机器进行通讯。

    Socket

    实际上,现代操作系统的内核都会带有socket相关的api,我们的代码在运行时,只需要调用操作系统提供的接口,就可以轻松建立网络连接,这也是我们之前讲过的面向接口编程的具体场景之一。

    我们这里直接讲Go语言中的Socket。在GO语言中有一个叫做syscall的包,里面有对应的一整套的socket的方法,并且这些方法是做过跨平台处理的,我们最常用的Http包里的许多建立连接,接收内容的方法都直接或者间接的用了syscall包。

    总而言之,我们常用的Http包在建立链接时需要使用到socket,socket建立连接时需要具体的传输层协议。

    Http

    基础知识

    HTTP属于应用层协议,也就是最顶层协议。目前他有三个版本:

    • HTTP1.1 最常用的版本,使用TCP作为运输层协议。

    • HTTP2 一个升级版本,用的不多。同样使用TCP作为运输层协议。

    • HTTP3 设计了一个新的传输层协议QUIC,可以选择TCP或者UDP来传输数据。

    注意,HTTP协议诞生的年代相当久远,它是一个无状态的协议。

    一个HTTP的请求有两部分组成:头部header和主体body。

    //这是一个GET请求的头部。:authority: api.bilibili.com:method: GET:path: /x/WEB-interface/bgroup/member/in?business=MGR&name=PCQoE%E4%BA%BA%E7%BE%A41&dimension=1:scheme: httpsaccept: application/JSON, text/plain, */*accept-encoding: gzip, deflate, braccept-language: zh-CN,zh;q=0.9,sm;q=0.8,en;q=0.7cache-control: no-cachecookie: origin: https://www.bilibili.compragma: no-cachereferer: https://www.bilibili.com/?utm_source=gold_browser_extensionuser-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/111.0.0.0 Safari/537.36

    头部中有几个特别的字段需要关注下。origin,referer, user-agent, accept。另外,还有几个特别的字段:Content-Length,Connection。TCP协议本身是基于字节流的,它无法区分消息边界,需要应用层协议自己来实现。

    可以详细看下Response返回的头部中都有哪些字段。另外,一些常见的字段我们经常在Postman中使用。

    客户端

    在Go语言中启动一个客户端是相当简单的一件事,Go为HTTP提供了大量的开箱即用的工具

    url := "https://www.bilibili.com" //我们要请求的地址resp, err := http.Get(url) //get请求,经典返回:内容和一个ERRdefer func() {_ = resp.Body.Close()  //通常我们需要及时关闭掉返回内容。}()if err != nil {fmt.Printf("请求错误: %v\n", err)}fmt.Printf("返回状态:\n%s\n", resp.Status)

    但是,我们通常不会这样直接调用。http.Get的底层调用的是http.Client,返回的是http.Response。通常情况下,我们会使用http.Client结合业务场景来构造一些请求:

    url := "https://www.bilibili.com"req, _ := http.NewRequest(http.MethodGet, url, nil) //req 是一个Request结构,它有大量的方法的熟悉 可以自定义。req.FORM.Add("test", "1231")                        //构造一个表单提交req.Header.Set("Cookie", "123")                     //设置Cookieresp, err := http.DefaultClient.Do(req) //这里使用的依然是默认的DefaultClientif err != nil {fmt.Printf("请求错误: %v\n", err)}defer func() {_ = resp.Body.Close()}()fmt.Printf("返回状态:\n%s\n", resp.Status)

    正常情况下,我们使用http.DefaultClient.Do,直接调用默认的http.Client就可以正常发起请求。在某些情况下,公司内部会封装一个统一的http.Client,里面会集成一些公司内统一的调用标识,服务请求方,提供方,trace,机器编码,统一的过期时间等配置信息。

    http.Client的结构非常简单:

    type Client struct {Transport RoundTripper //真正干活的结构体CheckRedirect func(req *Request, via []*Request) error //一个重定向校验方法,用的比较少jar CookieJar //Cookie包,我们常用的方法都在这个接口中Timeout time.Duration //单次完整HTTP请求的超时时间,0代表没有设置。}

    如果有时间,可以看下 DefaultTransport的源码,通过简单配置,进而理解Http与TCP的一些关键配置项的含义。

    最后,如果你愿意也可以自己造个轮子,但是我们决不提倡这种行为。

    conn, err := net.Dial("tcp", "bilibili.com:80")if err != nil {fmt.Printf("connect err => %s\n", err.Error())}buf := bytes.Buffer{}buf.WriteString("GET / HTTP/1.1\r\n")buf.WriteString("Host: baidu.com\r\n")buf.WriteString("USer-Agent: Go-http-client/1.1\r\n")// 请求头结束buf.WriteString("\r\n")// 请求body结束buf.WriteString("\r\n\r\n")_, _ = conn.Write(buf.Bytes())// 获取响应信息resp, _ := io.ReadAll(conn)fmt.Printf("响应信息\n%q", resp)

    http.Client的底层是基于net.Dial实现的,net.Dial底层又调用了操作系统的Socket相关接口。

    可以尝试实现一个Post方法。

    服务端

    Go语言搭建一个服务器非常简单,只需要用到几个方法:

    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {_, _ = fmt.Fprintf(writer, "关注 香香编程喵喵喵,关注香香编程谢谢喵喵喵!")})panic(http.ListenAndServe(":8080", nil))

    http.HandleFunc用来注册一个处理器。其内部会持有一个哈希,用来存储路径与处理器的映射关系。注意,这里和Gin框架就有区别了。

    http.ListenAndServe用来监听一个端口上的TCP链接,并处理后续的请求。它的底层调用的是net.Listen,同样也是基于Socket的方法,我们这里不做展开。

    到此,关于“Go语言网络编程与Http源码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: Go语言网络编程与Http源码分析

    本文链接: https://www.lsjlt.com/news/353793.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Go语言网络编程与Http源码分析
      这篇文章主要介绍“Go语言网络编程与Http源码分析”,在日常操作中,相信很多人在Go语言网络编程与Http源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程与Http源码分析”的疑惑有所...
      99+
      2023-07-05
    • 怎么进行Go语言HTTP Server源码分析
      这期内容当中小编将会给大家带来有关怎么进行Go语言HTTP Server源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go语言中HTTP Server:HTTP  server,顾名思义...
      99+
      2023-06-17
    • Golang HTTP编程源码分析
      这篇文章主要介绍“Golang HTTP编程源码分析”,在日常操作中,相信很多人在Golang HTTP编程源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang H...
      99+
      2023-07-05
    • go语言字符类型byte与rune源码分析
      这篇文章主要介绍“go语言字符类型byte与rune源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言字符类型byte与rune源码分析”文章能帮助大家解决问题。一、byte类型介绍by...
      99+
      2023-07-05
    • Go语言进阶freecache源码分析
      这篇文章主要介绍“Go语言进阶freecache源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言进阶freecache源码分析”文章能帮助大家解决问题。00. 什么是 freecach...
      99+
      2023-07-06
    • Go语言context test源码分析详情
      目录1.测试例子分析2.单元测试1.测试例子分析 example_test.go,展示了With-系列的4个例子 func ExampleWithCancel() {   gen :...
      99+
      2022-11-13
    • Go语言io pipe源码分析详情
      目录1.结构分析2.pipe sruct分析3.PipeReader对外暴露的是读/关闭4.写法5.总结pipe.go分析: 这个文件使用到了errors包,也是用到了sync库.文...
      99+
      2022-11-13
    • go语言构建顺序源码分析
      这篇文章主要介绍“go语言构建顺序源码分析”,在日常操作中,相信很多人在go语言构建顺序源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言构建顺序源码分析”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-07-05
    • 对Go语言中的context包源码分析
      目录一、包说明分析二、包结构分析三、Context接口类型分析四、后续分析规划五、基于实现类型到常用函数六、With-系列函数七、扩展功能以及如何扩展八、补充一、包说明分析 cont...
      99+
      2022-11-13
    • Go语言读写锁RWMutex的源码分析
      目录前言RWMutex 总览深入源码数据结构RLock()RUnlock()Lock()Unlock()常见问题实战一下前言 在前面两篇文章中 初见 Go Mutex&nb...
      99+
      2022-11-11
    • go语言怎么进行网络编程
      go语言进行网络编程的步骤如下:1、导入net包和其他需要的包;2、创建服务器或客户端连接;3、处理连接,为每个连接创建一个新的“goroutine”来处理;4、处理数据,使用“conn.Read()”读取数据,使用“conn.Write(...
      99+
      2023-12-13
      Go语言网络编程 go语言 Golang
    • 如何分析Go语言的库源码文件
      这期内容当中小编将会给大家带来有关如何分析Go语言的库源码文件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。go适合做什么go是golang...
      99+
      2022-10-19
    • Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
      本文转载 https://www.javadoop.com本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点...
      99+
      2023-06-02
    • Go语言网络编程:Go实现简单的内网穿透
      一、内网穿透 1. 内网穿透介绍 内网穿透是一种通过互联网建立远程连接到私有网络(内网)中设备的技术。通常情况下,内网设备由于位于一个受限制的网络环境中,无法直接从外部访问。内网穿透通过将内网设备的流...
      99+
      2023-09-02
      golang 服务器 计算机网络
    • Go语言七篇入门教程六网络编程
      目录1. Socket 编程1.1 Dial()函数2. HTTP 编程2.1 HTTP 客户端2.2 HTTP 服务端2.2.1 处理 HTTP 请求3. RPC 编程3.1 Go...
      99+
      2022-11-12
    • Go语言网络编程知识点有哪些
      这篇文章主要介绍“Go语言网络编程知识点有哪些”,在日常操作中,相信很多人在Go语言网络编程知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程知识点有哪些”的疑惑有所帮助!接下来,请跟...
      99+
      2023-06-25
    • Go语言学习之JSON编码解析与使用
      目录1.Map转JSON2. Json转Map3.结构体转JSON3.1 无字段标签3.2 有字段标签3.3 匿名字段4.JSON转结构体5.切片转JSON6.JSON转切片1.Ma...
      99+
      2023-02-14
      Go语言JSON解析 Go语言JSON使用 Go JSON
    • 如何理解Go语言基础之网络编程
      本篇内容主要讲解“如何理解Go语言基础之网络编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Go语言基础之网络编程”吧!socker编程我们所学的TC...
      99+
      2022-10-19
    • go语言分布式id生成器及分布式锁源码分析
      本文小编为大家详细介绍“go语言分布式id生成器及分布式锁源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“go语言分布式id生成器及分布式锁源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。分布式 i...
      99+
      2023-07-05
    • 如何使用Go语言和Redis进行网络编程
      如何使用Go语言和Redis进行网络编程?Redis是一个开源的内存数据结构存储系统,它提供了一组丰富的数据类型和功能,使得在开发网络应用程序时能够更快地处理数据。Go语言是一种快速、强大和简单的编程语言,特别适合用于构建高性能的服务器和分...
      99+
      2023-10-27
      Go语言 redis 网络编程
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作