1、net包

1、lookUp地址信息查找相关

  1. //InterfaceAddrs 返回该系统的网络接口的地址列表。
  2. addr, _ := net.InterfaceAddrs()
  3. fmt.Println(addr)
  4. //Interfaces 返回该系统的网络接口列表
  5. interfaces, _ := net.Interfaces()
  6. fmt.Println(interfaces)
  7. //LookupAddr 查询某个地址,返回映射到该地址的主机名序列
  8. lt, _ := net.LookupAddr("www.alibaba.com")
  9. fmt.Println(lt)
  10. //LookupCNAME函数查询name的规范DNS名(但该域名未必可以访问)。
  11. cname, _ := net.LookupCNAME("www.baidu.com")
  12. fmt.Println(cname)
  13. //LookupHost函数查询主机的网络地址序列。
  14. host, _ := net.LookupHost("www.baidu.com")
  15. fmt.Println(host)
  16. //LookupIP函数查询主机的ipv4和ipv6地址序列。
  17. ip, _ := net.LookupIP("www.baidu.com")
  18. fmt.Println(ip)

2、地址操作

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

3、错误说明

接口定义:

  1. type Error interface {
  2. error
  3. Timeout() bool // 错误是否为超时?
  4. Temporary() bool // 错误是否是临时的?
  5. }

错误说明:

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

  1. // DNSError represents a DNS lookup error.
  2. type DNSError struct {
  3. Err string // description of the error
  4. Name string // name looked for
  5. Server string // server used
  6. IsTimeout bool // if true, timed out; not all timeouts set this
  7. IsTemporary bool // if true, error is temporary; not all errors set this
  8. IsNotFound bool // if true, host could not be found
  9. }

DNS查询的错误。

  1. // DNSError represents a DNS lookup error.
  2. type DNSError struct {
  3. Err string // description of the error
  4. Name string // name looked for
  5. Server string // server used
  6. IsTimeout bool // if true, timed out; not all timeouts set this
  7. IsTemporary bool // if true, error is temporary; not all errors set this
  8. IsNotFound bool // if true, host could not be found
  9. }

地址错误

  1. type AddrError struct {
  2. Err string
  3. Addr string
  4. }

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

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

4、连接(以Tcp为例子)

客户端

  1. package test
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. )
  7. func main() {
  8. //1.创建链接远程链接服务器,得到一个conn链接
  9. conn, err := net.Dial("tcp", "127.0.0.1:8081")
  10. if err != nil {
  11. fmt.Println("client start err,exit!")
  12. return
  13. }
  14. i := 1
  15. for {
  16. //2.调用链接Write写数据
  17. _, err := conn.Write([]byte(fmt.Sprintf("%s:%d", "Hello Server", i)))
  18. if err != nil {
  19. fmt.Println("write conn err", err)
  20. return
  21. }
  22. buf := make([]byte, 512)
  23. cnt, err := conn.Read(buf)
  24. if err != nil {
  25. fmt.Println("read buf err")
  26. return
  27. }
  28. fmt.Printf("Server call back:%s,cnt = %d\n", buf, cnt)
  29. i++
  30. time.Sleep(1)
  31. }
  32. }

服务端

  1. package test
  2. import (
  3. "fmt"
  4. "log"
  5. "net"
  6. )
  7. func chkError(err error) {
  8. if err != nil {
  9. log.Fatal(err)
  10. }
  11. }
  12. func main() {
  13. //创建一个TCP服务端
  14. ta, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8081")
  15. chkError(err)
  16. //监听端口
  17. tl, err2 := net.ListenTCP("tcp", ta)
  18. chkError(err2)
  19. fmt.Println("Server Start")
  20. //.建立链接并处理
  21. go func() {
  22. for {
  23. //如果有客户端链接过来,阻塞会返回
  24. conn, err := tl.AcceptTCP()
  25. if err != nil {
  26. fmt.Println("Accept err", err)
  27. continue
  28. }
  29. //已经与客户端建立链接,处理业务
  30. go func() {
  31. for {
  32. buf := make([]byte, 512)
  33. cnt, err := conn.Read(buf)
  34. if err != nil {
  35. fmt.Println("recv buf err", err)
  36. continue
  37. }
  38. //回显功能
  39. if _, err := conn.Write(buf[:cnt]); err != nil {
  40. fmt.Println("write bak buf err", err)
  41. continue
  42. }
  43. }
  44. }()
  45. }
  46. }()
  47. //阻塞状态
  48. select {}
  49. }

2、net/http包

1、连接、监听

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

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

创建Client,发送设置好的request

  1. client := &http.Client{CheckRedirect: redirectPolicyFunc,}
  2. resp, err := client.Get("http://example.com")
  3. req, err := http.NewRequest("GET", "http://example.com", nil) //创建一个request
  4. req.Header.Add("If-None-Match", `W/"wyzzy"`) //设置头部
  5. resp, err := client.Do(req)

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

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

  1. tr := &http.Transport{
  2. TLSClientConfig: &tls.Config{RootCAs: pool},
  3. DisableCompression: true,
  4. }
  5. client := &http.Client{Transport: tr}
  6. resp, err := client.Get("https://example.com")

4、完整例子

客户端:

  1. package test
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net/http"
  6. )
  7. func main() {
  8. response, _ := http.Get("http://localhost:80/hello")
  9. defer response.Body.Close()
  10. body, _ := ioutil.ReadAll(response.Body)
  11. fmt.Println(string(body))
  12. }

服务端:

  1. package test
  2. import (
  3. "flag"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. )
  8. func main() {
  9. host := flag.String("host", "127.0.0.1", "listen host")
  10. port := flag.String("port", "80", "listen port")
  11. http.HandleFunc("/hello", Hello)
  12. err := http.ListenAndServe(*host+":"+*port, nil)
  13. if err != nil {
  14. panic(err)
  15. }
  16. }
  17. func Hello(w http.ResponseWriter, req *http.Request) {
  18. _, _ = w.Write([]byte("Hello World"))
  19. }