go语言标准库net包,支持基于IP层、TCP/UDP层及更高层面(HTTP、FTP、SMTP)的网络操作,基于IP层的称为Raw Socket
Socket编程
传统语言的方式:
- 建立Socket
- 绑定Socket
- 监听
- 接受连接
- 接收
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个错误,但若有一个系统错误导致程序出现异常,那么程序同样还是会终止运行。
我们不能预计一个工程里边会有多少意外情况,但不管什么意外,只要会触发错误处理流程,我们就有办法对其进行处理。
使用闭包避免程序运行时出现崩溃