-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46583
- shell命令
-
- 文章:(42)篇
- 阅读:154313
- Git教程
-
- 文章:(36)篇
- 阅读:234926
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131960
-
go里面net包的使用简介(一)2018-03-26 11:54 阅读(4914) 评论(0)
一、简介
在其他语言中,当我们使用socket编程的时候,往往遵循如下编程模式:
(1)建立socket,使用socket()函数
(2)绑定socket,使用bind函数
(3)服务端监听,使用listen函数,客户端连接,使用connect函数。
(4)接受连接,使用accept函数
(5)接受数据,使用receive函数,发送数据使用send函数
但在go语言net包中,对这个过程进行了抽象和封装。无论我们使用什么协议,建立什么形式的连接,统一使用 net.Dial()即可。
Dial ()函数的原型如下:
func Dial(network, address string) (Conn, error)
参数
net是网络协议的名称,主要支持:tcp、tcp4、tcp6、udp、udp4、udp6、ip、ip4、ip6
address代表Ip地址或是域名。
如下:
建立tcp连接
conn,err := net.Dial("tcp", "127.0.0.1:3306")
建立udp连接
conn,err := net.Dial("udp", "127.0.0.1:9001"
建立ICMP连接(使用协议名称)
conn,err := net.Dial("ip4:icmp", "www.findme.wang")
建立ICMP连接(使用协议编号)
conn,err := net.Dial("ip4:1", "www.findme.wang")
返回值
如果连接成功,返回连接的对象,否则返回error。
关于conn对象,包含了Write()方法和Read()方法,Write方法用于发送数据,Read方法用于读取数据。
二、TCP编程
下面,我们建立tcp连接,简单的实现http协议,向网络主机发送HTTP get请求,关于http请求可以参考这里,并读取主机返回的信息。代码如下:
package main import ( "net" "fmt" "os" "bytes" "io" ) func main() { conn, err := net.Dial("tcp", "www.findme.wang:80") //打开tcp连接 if err != nil { fmt.Println("连接出错:", err) os.Exit(0) } httpHead := []byte("get / HTTP/1.0\r\nHost:www.findme.wang\r\n\r\n") //构建head请求字符串 _, err = conn.Write(httpHead) //发起head请求 if err != nil { fmt.Println("请求失败:", err) os.Exit(0) } //读取所有返回的数据 result := bytes.NewBuffer(nil) //构建一个buffer用于存储读取的数据 var buf [512]byte //设置每次读取的字符数 for { n, err := conn.Read(buf[0:]) result.Write(buf[0:n]) if err!= nil { if err == io.EOF { break; } fmt.Println("读取失败:", err) } } //打印所有的数据 fmt.Println(string(result.Bytes())) }
执行结果如下:
三、http编程
上面,我们通过tcp模拟http请求,接下来我们将直接使用net包下面的http包,实现http请求。
http包中基本方法
func (c *Client) Get(url string) (r *Response, err error) func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, errerror) func (c *Client) PostForm(url string, data url.Values) (r *Response, err error) func (c *Client) Head(url string) (r *Response, err error) func (c *Client) Do(req *Request) (resp *Response, err error)
1、Get方法
http.Get()方法,等价于http.DefaultClient.Get()。案例如下:
res, err := http.Get("http://www.baidu.com") // 请求会把返回的内容,res的body中 if err != nil { fmt.Println(err) panic("请求出错") } /**从res读取内容**/ defer res.Body.Close() // 读取结束后关闭流,类似文件操作完后,需要关闭一样 fmt.Println("响应状态:", res.StatusCode) // 响应状态 fmt.Println("响应头", res.Header) // 响应头 /*读取内容*/ reqBody, err := ioutil.ReadAll(res.Body) if err != nil { fmt.Println(err) } fmt.Println(reqBody)
2、Post方法
post发送数据,也比较简单,依次传递下面三个参数即可:
url string,请求的url
bodyType string,Post传递的数据对应的资源类型,比如 "image/jpeg",“text/html”,“application/xhtml+xml”,“application/xml”等
body io.Reader 数据的比特流([] byte形式)
如下:
v := url.Values{} v.Set("name", "dq") v.Encode() //将字符串转为 http.Post("http://127.0.0.1", "application/json", dataStr)