网络通信
1. UDP解释
简介
UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。
个人简单理解UDP
- 相对于TCP会丢失数据
- 速度快
- 应用于视频等数据可以包容丢失的情况
1-1 UDP写服务端
看注释,不需要解析
package main
import (
"fmt"
"net"
"os"
)
func HandleError(err error, when string) {
if err != nil {
fmt.Println("错误地址,err", when, err)
// 非正常退出,正常退出为0
os.Exit(0)
}
}
func main() {
// 解析得到UDP地址 返回指针
udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8888")
HandleError(err, "ResolveUDPAddr")
// 在UDP地址上建立UDP监听,得到连接 传入指针类型
udpConn, err := net.ListenUDP("udp", udpAddr)
HandleError(err, "ListenUDP")
buffer := make([]byte, 1024)
// 从连接中读入内容,丢入缓冲区
n, remoteAddr, err := udpConn.ReadFromUDP(buffer)
HandleError(err, "udpConn")
fmt.Printf("读到来自%v的内容:%s", remoteAddr, string(buffer[:n]))
udpConn.WriteToUDP([]byte("朕以阅"), remoteAddr)
}
1-2 UDP写客户端
package main
import (
"fmt"
"net"
"os"
)
func handleError(err error, when string) {
if err != nil {
fmt.Println("错误地址,err", when, err)
// 非正常退出,正常退出为0
os.Exit(0)
}
}
func main() {
// 拨号请求连接
conn, e := net.Dial("udp", "127.0.0.1:8888")
handleError(e, "Dial")
defer conn.Close()
// 向连接中写出信息
n, err := conn.Write([]byte("咔咔手赚网地址:fangkang.top"))
handleError(err, "Write")
fmt.Println("写出字节数", n)
// 创建缓冲区
buffer := make([]byte, 1024)
n, err = conn.Read(buffer)
handleError(err, "conn.Read")
fmt.Println(string(buffer[:n]))
}
1-3 运行客户端和服务端的代码
先跑服务端代码
然后执行客户端
1-4 简单说明打印的数据来源
2. 发起HTTP-GET请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func getError(err error, when string) {
if err != nil {
fmt.Println("错误地址,err", when, err)
// 非正常退出,正常退出为0
os.Exit(0)
}
}
func main() {
url := "https://fangkang.top"
resp, err := http.Get(url)
getError(err, "http.Get")
// response属于io资源,用完需要关闭
defer resp.Body.Close()
// 获取body的内容
bytes, err := ioutil.ReadAll(resp.Body)
getError(err, "ioutil.ReadAll")
// 返回的是字节需要转为字符串
fmt.Println(string(bytes))
}
3. 发起HTTP-POST请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"strings"
)
func postError(err error, when string) {
if err != nil {
fmt.Println("错误地址,err", when, err)
// 非正常退出,正常退出为0
os.Exit(0)
}
}
func main() {
url := "https://www.fangkang.top/api/subjectByType"
resp, err := http.Post(
// 请求地址
url,
// 携带的数据类型
"application/x-www-form-urlencoded",
// 携带的参数
strings.NewReader("st_id=1"))
postError(err, "http.Post")
// response属于io资源,用完需要关闭
defer resp.Body.Close()
// 获取body的内容
bytes, err := ioutil.ReadAll(resp.Body)
postError(err, "ioutil.ReadAll")
// 返回的是字节需要转为字符串
fmt.Println(string(bytes))
}