【GO】入门级网络通讯,一看就懂

2021年11月26日 阅读数:3
这篇文章主要向大家介绍【GO】入门级网络通讯,一看就懂,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1. UDP解释

简介

UDP(User Datagram Protocol),用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无链接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP提供了无链接通讯,且不对传送数据包进行可靠性保证,适合于一次传输少许数据,UDP传输的可靠性由应用层负责。api

我的简单理解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))
}

在这里插入图片描述

博主微信欢迎交流

在这里插入图片描述