go语言编程 要点总结(五)网络编程

go语言编程 要点总结(五)网络编程

go语言标准库net包,支持基于IP层、TCP/UDP层及更高层面(HTTP、FTP、SMTP)的网络操作,基于IP层的称为Raw Socket

Socket编程

传统语言的方式:

  1. 建立Socket
  2. 绑定Socket
  3. 监听
  4. 接受连接
  5. 接收

Dial()函数

func Dial(net, addr string)(Conn, error)

例子:

conn, err := net.Dial("tcp", "192.168.0.10:2100")

目前Dial函数支持如下协议:“tcp”、“tcp4用于IPv4”、“tcp6仅限IPv6”、“udp”、“dup4”、“udp6”、“ip”、“ip4”、“ip6”

连接成功后写数据用conn的Writer()成员,接收数据用Read()方法

Dial()函数是对DialTCP()、DIaoUDP、DialIP、DialUnix的封装,这些函数也可以直接使用

net.ResolveTCPAddr(net, addr string)用于把字符串解析为地址对象,传递给DialTCP函数调用

func net.ParseIP() 验证IP地址有效性

func IPv4Mask(a, b, c, d byte) IPMask 创建子网掩码

func (ip IP) DefaultMask() IPMask 获取子网掩码

根据域名查找IP的代码

func ResolveIPAddr(net, addr string)(*IPAddr, error)

func LookupHost(name string)(cname string, addrs []string, err error)

HTTP编程

HTTP(HyperText Transfer Protocol,超文本传输协议)

go语言标准库内建net/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, err error) 以POST方式发送数据

func (c *Client) PostForm(url string, data url.Values)(r *Response, err error) 提交表单

func (c *Client) Head(url string) (r *Response, err error) 只请求url头部信息

func (c *Client) Do(req *Request)(r *Response, err error) 需要更多的定制信息,设定一些自定义的http Header字段,比如设置自定义的“User-Agent”,而不是默认的“Go http package”,传递Cookie

上述放啊都是在http.DefaultClient的的基础上进行调用,比如Get等价于tttp.DefaultClient.Get()

事实上是可以基于http包中的Client的类型进行定制的

type Client struct {

Transport RoundTripper

CheckRedirect func(req *Request, via[]*Request) error

Jar CookieJar

}

Transport类型必须实现http.RoundTripper接口。Transport指定了执行一个HTTP请求的运行机制,如果不指定具体的,默认会使用http.DefaultTransport,意味着Transport是可以自定义的

CheckRedirect函数指定处理重定向策略,如果返回状态吗为30x,会在跳转规则之前先调用该函数

Jar可用于在HTTP Client中设定Cookie,Jar的类型必须实现了http.CookieJar接口,该接口预定义了SetCookie和Cookies两个方法,如果HTTP Client中没有设定Jar,Cookie将被忽略而不会发送到客户端

HTTP服务器

func ListenAndServe(addr string, handler Handler) error addr监听地址,handler服务端处理程序。

handler通常为空,这意味着服务端调用http.DefaultServeMux进程处理。

服务端编写的业务逻辑处理程序http.Handle() http.HandleFunc()默认注入http。DefaultServeMux中

如果想更多控制服务端行为,可以自定义http.Server

funcListenAndServeTLS(addr string, certFile string, keyFIle string, handler Handler) error 行为与ListenAndServe()的行为一致,区别只是处理https

RPC编程

net/rpc包

客户端可以通过网络或其他IO连接调用一个远端对象的公开方法,必须大写字母开头

服务端可以将一个对象注册为可访问的服务,之后该对象的公开方法就能够以远程的方式提供访问,一个rpc服务端可以注册多个不同类型的对象,不允许注册同一类型的多个对象

可被RPC访问的对象必须符合下列条件

在对象外部可公开调用的方法

必须有两个参数,且参数类型都必须是包外部可以访问的类型或是内建类型

第二个参数必须是一个指针

方法必须返回一个error类型的值

func (t *T)MethodName(argType T1, replyType *T2) error

第一个参数由客户端传入,第二个参数返回给RPC客户端结果

服务端可以通过调用rpc.ServeConn处理单个连接请求

客户端通过rpc.Dial()和rpc.DialHTTP()方法与指定的服务端建立连接

可以使用同步和异步方式处理

Call()方法是同步

Go()方法是异步的

无论是Call还是Go都必须指定调用的服务及其方法名,客户但传入参数的引用,处理结果参数指针

没有指定rpc传输中的编码解析器,模式将使用标准库提供的encoding/gob包进行数据传输

Gob简介

encoding/gob

数据结果使用Gob序列化之后,能够用于网络传输

Gob是二进制编码数据流,JSON和XML基于文本描述

Gob无法跨语言使用,只局限在go的RPC进程间通信

客户端和服务端可以自定义编码解码方式,通过实现接口ClientCodec和ServerCodec

JSON处理

net/rpc/json就是实现了上述接口的rpc模块

go语言中大多数数据类型都可以转化为JSON文本,但channel、complex和函数这集中类型除外

如果转换的数据结构中有指针,则转化指针指向的值,如果指针指向的是零值,null将作为转化后的结果

未知结构解码,可以解码到空接口,因为空接口是通用类型

错误处理

从DRY的 原则来看,不应该在程序中到处使用一样的代码

根据墨菲定律,尽管我们从书写上能保证大多数错误能得到相应的处理,但可能出问题的地方就一定会出问题,如果程序中我们正确地处理了99个错误,但若有一个系统错误导致程序出现异常,那么程序同样还是会终止运行。

我们不能预计一个工程里边会有多少意外情况,但不管什么意外,只要会触发错误处理流程,我们就有办法对其进行处理。

使用闭包避免程序运行时出现崩溃


分享到:


相關文章: