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個錯誤,但若有一個系統錯誤導致程序出現異常,那麼程序同樣還是會終止運行。
我們不能預計一個工程裡邊會有多少意外情況,但不管什麼意外,只要會觸發錯誤處理流程,我們就有辦法對其進行處理。
使用閉包避免程序運行時出現崩潰
閱讀更多 oscube 的文章