目录
3、管理代理、TLS配置、keep-alive、压缩和其他设置
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
}
// 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"))
}