GO语言学习之网络编程

网络编程

无论我们期望使用什么类型的协议建立什么形式的链接,都只需调用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的语法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值