golang net 网络包 常用方法

目录

1、net包

1、lookUp地址信息查找相关

2、地址操作

3、错误说明

4、连接(以Tcp为例子)

2、net/http包

1、连接、监听

2、管理HTTP客户端的头域、重定向策略和其他设置

3、管理代理、TLS配置、keep-alive、压缩和其他设置

4、完整例子


1、net包

1、lookUp地址信息查找相关

	//InterfaceAddrs 返回该系统的网络接口的地址列表。
	addr,_ := net.InterfaceAddrs()
	fmt.Println(addr)

	//Interfaces 返回该系统的网络接口列表
	interfaces,_ := net.Interfaces()
	fmt.Println(interfaces)

	//LookupAddr 查询某个地址,返回映射到该地址的主机名序列
	lt,_ := net.LookupAddr("www.alibaba.com")
	fmt.Println(lt)

	//LookupCNAME函数查询name的规范DNS名(但该域名未必可以访问)。
	cname,_ := net.LookupCNAME("www.baidu.com")
	fmt.Println(cname)

	//LookupHost函数查询主机的网络地址序列。
	host,_ := net.LookupHost("www.baidu.com")
	fmt.Println(host)

	//LookupIP函数查询主机的ipv4和ipv6地址序列。
	ip,_ := net.LookupIP("www.baidu.com")
	fmt.Println(ip)

2、地址操作

	//函数将host和port合并为一个网络地址。一般格式为"host:port";如果host含有冒号或百分号,格式为"[host]:port"。
	//Ipv6的文字地址或者主机名必须用方括号括起来,如"[::1]:80"、"[ipv6-host]:http"、"[ipv6-host%zone]:80"。
	hp := net.JoinHostPort("127.0.0.1","8080")
	fmt.Println(hp)

	//函数将格式为"host:port"、"[host]:port"或"[ipv6-host%zone]:port"的网络地址分割为host或ipv6-host%zone和port两个部分。
	shp,port,_ := net.SplitHostPort("127.0.0.1:8080")
	fmt.Println(shp," _ ",port)

3、错误说明

接口定义:

	type Error interface {
	    error
	    Timeout() bool   // 错误是否为超时?
	    Temporary() bool // 错误是否是临时的?
	}

错误说明:

读取主机DNS配置时出现的错误

	// DNSError represents a DNS lookup error. 
	type DNSError struct {
	Err         string // description of the error
	Name        string // name looked for
	Server      string // server used
	IsTimeout   bool   // if true,timed out; not all timeouts set this
	Istemporary bool   // if true,error is temporary; not all errors set this
	IsNotFound  bool   // if true,host Could not be found
}

DNS查询错误

	// DNSError represents a DNS lookup error.
	type DNSError struct {
	Err         string // description of the error
	Name        string // name looked for
	Server      string // server used
	IsTimeout   bool   // if true,host Could not be found
}

地址错误

	type AddrError struct {
		Err  string
		Addr string
	}

返回该错误的操作、网络类型和网络地址。

	// OpError is the error type usually returned by functions in the net
	// package. It describes the operation,network type,and address of
	// an error.
	type OpError struct 

4、连接(以Tcp为例子)

客户端

	package test

	import (
		"fmt"
		"net"
		"time"
	)
	
	func main() {
		//1.创建链接远程链接服务器,得到一个conn链接
		conn,err := net.Dial("tcp","127.0.0.1:8081")
		if err != nil {
			fmt.Println("client start err,exit!")
			return
		}
		i := 1
		for {
			//2.调用链接Write写数据
			_,err := conn.Write([]byte(fmt.Sprintf("%s:%d","Hello Server",i)))
			if err != nil {
				fmt.Println("write conn err",err)
				return
			}
	
			buf := make([]byte,512)
			cnt,err := conn.Read(buf)
			if err != nil {
				fmt.Println("read buf err")
				return
			}
			fmt.Printf("Server call back:%s,cnt = %d\n",buf,cnt)
			i++
			time.Sleep(1)
		}
	}

服务端

	package test

	import (
		"fmt"
		"log"
		"net"
	)
	
	func chkError(err error) {
		if err != nil {
			log.Fatal(err)
		}
	}
	
	func main() {
		//创建一个TCP服务端
		ta,err := net.ResolveTCPAddr("tcp4","127.0.0.1:8081")
		chkError(err)
		//监听端口
		tl,err2 := net.ListenTCP("tcp",ta)
		chkError(err2)
		fmt.Println("Server Start")
		//.建立链接并处理
		go func() {
			for {
				//如果有客户端链接过来,阻塞会返回
				conn,err := tl.AcceptTCP()
				if err != nil {
					fmt.Println("Accept err",err)
					continue
				}
				//已经与客户端建立链接,处理业务
				go func() {
					for {
						buf := make([]byte,512)
						cnt,err := conn.Read(buf)
						if err != nil {
							fmt.Println("recv buf err",err)
							continue
						}
						//回显功能
						if _,err := conn.Write(buf[:cnt]); err != nil {
							fmt.Println("write bak buf err",err)
							continue
						}
					}
				}()
			}
		}()
		//阻塞状态
		select {}
	}

2、net/Http包

1、连接、监听

	//get方法调用
	resp,err := http.Get("http://example.com/")
	
	//post方法调用
	resp,err := http.Post("http://example.com/upload","image/jpeg",&buf)
	
	//表单方式调用
	resp,err := http.PostForm("http://example.com/form",url.Values{"key": {"Value"},"id": {"123"}})
	
	//服务端进行监听端口
	func (srv *Server) ListenAndServe() error 

2、管理HTTP客户端的头域、重定向策略和其他设置

创建Client,发送设置好的request

	client := &http.Client{CheckRedirect: redirectPolicyFunc,}
	resp,err := client.Get("http://example.com")
	req,err := http.NewRequest("GET","http://example.com",nil)  //创建一个request
	req.Header.Add("if-none-match",`W/"wyzzy"`) //设置头部
	resp,err := client.Do(req)

3、管理代理、TLS配置、keep-alive、压缩和其他设置

创建一个携带设置好的Transport信息的Client,并进行通信

	tr := &http.Transport{
		TLSClientConfig:    &tls.Config{RootCAs: pool},disableCompression: true,}
	client := &http.Client{Transport: tr}
	resp,err := client.Get("https://example.com")

4、完整例子

客户端:

	package test

	import (
		"fmt"
		"io/IoUtil"
		"net/http"
	)
	
	func main() {
		response,_ := http.Get("http://localhost:80/hello")
		defer response.Body.Close()
	
		body,_ := IoUtil.ReadAll(response.Body)
		fmt.Println(string(body))
	}

服务端:

	package test

	import (
		"flag"
		"fmt"
		"io/IoUtil"
		"net/http"
	)
	
	func main() {
		host := flag.String("host","127.0.0.1","listen host")
		port := flag.String("port","80","listen port")
	
		http.HandleFunc("/hello",Hello)
	
		err := http.ListenAndServe(*host+":"+*port,nil)
	
		if err != nil {
			panic(err)
		}
	}
	
	func Hello(w http.ResponseWriter,req *http.Request) {
		_,_ = w.Write([]byte("Hello World"))
	}

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...