这是我参与「第五届青训营 」伴学笔记创作活动的第 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… )阅读