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個錯誤,但若有一個系統錯誤導致程序出現異常,那麼程序同樣還是會終止運行。

我們不能預計一個工程裡邊會有多少意外情況,但不管什麼意外,只要會觸發錯誤處理流程,我們就有辦法對其進行處理。

使用閉包避免程序運行時出現崩潰


分享到:


相關文章: