Go 原生网络编程 | 青训营笔记

85 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

文章重点内容

  • Socket 网络编程

    • 服务器端
    • 客户端
  • 原生 HTTP 编程

    • 简单的请求
    • 自定义请求
    • 自定义客户端
    • HTTP 服务器

详细知识

Socket

  Socket 连接可用于应用与应用(同一设备或不同设备)之间的通信

Server

  服务端使用net.Listen()开启端口监听,该方法有两个参数:网络类型和监听地址:

listener, err := net.Listen("tcp", "0.0.0.0:38080")
if err != nil {
    panic(err)
}

  获取 Listener 后,使用其Accept()开启监听,该操作和后续操作一般写在无限循环中:

for {
    conn, err := listener.Accept()
    if err != nil {
        log.Printf("Accept fail: %v", err)
        continue
    }
    go processor(conn)
}

Client

  客户端使用net.Dial()或更加具体的方法建立连接:

conn, err := net.Dial("tcp4", "127.0.0.1:38080")
if err != nil {
    panic(err)
}
defer conn.Close()

  接下来的操作和服务端一样,使用Read()Write()进行通信

HTTP

  包net/http提供了 HTTP 协议的相关功能:

简单请求

  GoLang 提供了对简单请求的封装http.Get()http.Post()http.PostForm,若不需要自定义请求头等,可直接使用:

// GET Request
resp, err := http.Get("http://localhost:8080/get?id=1")
// POST Request
resp, err := http.Post("http://localhost:8080/post",
        "application/json",
        strings.NewReader("{\"username\": \"admin\",\"password\": \"J\"}"))

  若 err 为空,可得到对响应报文的封装,即上述代码中的 resp。它包括状态码resp.StatusCode、响应头resp.Header、响应体resp.Body等。

自定义请求

  若需要自定义请求头等信息或使用其他请求方式,可创建自定义的请求:

targetUrl := "http://localhost:8080/put"
payload := strings.NewReader("{\"name\":\"Monroe\"}")
// 创建请求报文
req, _ := http.NewRequest("PUT", targetUrl, payload)
// 自定义请求头
req.Header.Add("Content-Type", "application/json")
// 发送请求
resp, err := http.DefaultClient.Do(req)

HTTP 客户端

  上述请求始终在使用默认的 HTTP 客户端,我们也可以自己自定义一个 HTTP 客户端:

client := &http.Client{
    CheckRedirect: redirectPolicyFunc,
}

  我们可以自定义传输(Transport)、重定向处理函数(CheckRedirect)、Cookie 存储机制(Jar)和请求超时(Timeout)。

HTTP 服务器

  可以使用“默认”服务器提供 HTTP 服务,只需使用http.HandleFunc()绑定路由和处理函数:

http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))

   也可自定义 HTTP 服务器:

s := &http.Server{
    Addr:           ":8080",
    Handler:        myHandler,
    ReadTimeout:    10 * time.Second,
    WriteTimeout:   10 * time.Second,
    MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())

参考资料

本文若有不足之处,欢迎纠正(≧^.^≦)喵~
我的其他笔记,可在掘金或 Github( github.com/DoudiNCer/I… )阅读