网络编程
无论我们期望使用什么类型的协议建立什么形式的链接,都只需调用net.Dail即可
Tcp
Conn,err:=net.Dail(“tcp”,”192.168.1.1:10086”)
Udp
Conn,err:=net.Dail(“udp”,”127.0.0.1:8080”)
ICMP
Conn,err:=net.Dial(“”ip4 :1”,1001.10.4.1;456””)
net.ResolveTCPAddr()用于解析地址和端口号
net.DialTcp()用于建立链接
HTTP 编程
http.Get()
要请求一个资源,只需调用http.Get()方法,示例代码如下:
Resp,err:=http.Get(“http://example.com/”)
Iferr!=nil{
//处理错误
return
}
deferresp.Body.close()
io.copy(os.stdout,resp.Body)
http函数,只需调用http.Post()方法依次传递下面的格式选要传递
http.PostForm()
posyfrom方法实现了标准编码格式、
http.Head
http中的head请求方式表明请求目标的URL信息
HTTP客户端
net/http包的client类型提供了如下几个方法,让我们可以用最简洁的方式实现HTTP请求
http.Get(),要请求一个资源,只需调用http.Get()方法
http.Get(“http://example.com/”)
http.Post(),要以POST方式发送数据,也很简单,只需要调用http.Post()方法并依次传递下面几个参数即可:
请求的目标URL
将要POST数据的资源类型(MIMEType)
数据的比特流([]byte流式)
http.Post(http://example.com/upload,”image/jpeg”,&imageDataBuf)
http.PostForm(),实现了标准编码格式为application/x-www-form-urlencoded的表单提交。
http.PostForm(http://example.com/posts,url.Value{“title”:{“articletitle”},”content”:{“article body”}})
http.Head() 只返回HTTPhead不返回HTTP body
http.Head(“http://example.com/”)
网络通信net包
Net包对于I/O提供了便携式接口,包括TCP/IP/UDP,域名解析以及Unix Socket.尽管net包提供了大量访问底层的接口,但是大多数情况下,客户端仅仅只需要最基本的接口,例如Dail .Listen,Accepte以及分配的conn连接和listener接口。crypto/tls包使用相同的接口以及类似的Dail和listen函数。
funcInterfaceAddrs() 返回该系统的网络接口的地址列表
funcInterface() 返回该系统的网络接口列表
func JoinHostPost()将host和post合并为一个网络地址。一般格式为“host:post“;如果host含有冒号或百分号,格式为”[host]:port“
funcLookupCHAME(name string) 返回给定名字规范的DNS主机名称,如果调用者不关心name是否规范,可以直接调用LookupHost或者LookupIP,这两个函数都会在查询时考虑到name的规范性
func LookupHost(host string) 通过利用本地解析器查找host进行查找,返回主机地址的数组
funcLookupIP(host string) 通过利用本地解析器查找host,返回主机ipv4和ipv6地址的一个数组
测试代码
packagemain
import (
"fmt"
"net"
)
funcmain(){
Addr ,_ :=net.InterfaceAddrs()
fmt.Println(Addr)
interfaces,_ :=net.Interfaces()
fmt.Println(interfaces)
hp:=net.JoinHostPort("127.0.0.1","8080")
fmt.Println(hp)
la ,_:=net.LookupAddr("127.0.0.1")
fmt.Println(la)
cname,_:=net.LookupCNAME("www.baidu.com")
fmt.Println(cname)
host,_:=net.LookupHost("www.baidu.com")
fmt.Println(host)
ip,_:=net.LookupIP("www.baidu.com")
fmt.Println(ip)
}
得出结果
[127.0.0.1/8192.168.247.128/24 ::1/128 fe80::20c:29ff:fe6d:c1c/64]
[{116436 lo up|loopback} {2 1500 eth000:0c:29:6d:0c:1c up|broadcast|multicast}]
127.0.0.1:8080
[localhostlocalhost.localdomain. localhost4 localhost4.localdomain4.]
www.a.shifen.com.
[14.215.177.3814.215.177.39]
[14.215.177.3914.215.177.38]
net 包中存在的error
func (e*AddrError) Error() string 错误
func (e*AddrError) Temporary() bool 该错误是否是一个临时错误
func (e*AddrError) Timeout() bool 该错误是否是超时错误
typeAddr 网络终端地址
typeAddr interface{
Network() string //网络名称
String() string //地址字符串表示
}
Type Conn//conn是一个通用的面向流的网络连接,多个goroutine可以调用conn中的方法
typeConn interface{
Read(b []byte)(n int,err error)
//Read 从连接中读取数据,read的方法会在超过某个固定时间限制后返回一个表示超时的错误,该错误的Timeout()==True
Write (b[]byte)(n int,err error)
//Write 从连接中读取数据,write的方法也会在超过某个固定时间限制后返回一个表示超时的错误,该错误的Timeout()==True
Close() error
//Close方法关闭该连接,同时任何阻塞的read或write方法将不再阻塞,并返回错误
LocalAddr() Addr
//返回本机网络地址
RemoteAddr() Addr
//返回远端网络地址
}
Dial()函数
funcDial(net,addr string) (Conn,error)
其中net是网络协议的名字,addr参数是IP地址或域名,而端口号以”:”的形式随在地址或域名的后面,端口号可选。如果连接成功,返回连接对象,否则返回error
Tcp 连接
conn,err :=net.Dial(“tcp”,”192.168.0.125:1231”)
udp 连接
conn,err :=net.Dial(“udp”,”192.168.0.125:1231”)
ICMP链接(使用协议名称)
conn,err :=net.Dial(“ip4:icmp”,”www.baidu.com”)
ICMP链接(使用协议编号)
conn,err :=net.Dial(“ip4:1”,”10.0.0.3”)
在成功建立连接后,我们就可以进行数据的发送和接收。发送数据时,使用conn的Write()成员方法,接收数据时使用Read()方法
Type interfaceinterface表示一个在网络接口名和索引之间的映射,它也包含网络接口设备信息
funcInterfaceByIndex(index int) (*Interface, error) //通过指定的索引index返回相应的接口
funcInterfaceByName(name string) (*Interface, error) //通过指定的名字Name返回相应的接口
func(ifi *Interface) Addrs() ([]Addr, error) //返回指定接口的address
func(ifi *Interface) MulticastAddrs() ([]Addr, error) //MulticastAddrs返回网络接口ifi加入的多播组地址。
typeListener //Listern是一个用于面向流的网络协议的公用的网络监听器接口。多个线程可能会同时调用一个Listern的方法
typeListener interface{
Accept() (c Conn,err error) //等待并返回下一个连接到该连接的连接
Close() error //关闭listerner ,关闭后,任何阻塞accept的操作都不在阻塞,并且返回error
Addr() Addr //返回该接口的网络地址
}
funcListen(net, laddr string) (Listener, error) //返回在一个本地网络地址laddr上监听的Listener。网络类型参数net必须是面向流的网络:"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。具体参见Dial函数获取laddr的语法。