日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang——net/rpc包学习

發(fā)布時(shí)間:2024/10/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang——net/rpc包学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、rpc包

rpc包提供了通過網(wǎng)絡(luò)或其他I/O連接對一個(gè)對象的導(dǎo)出方法的訪問。

只有滿足如下標(biāo)準(zhǔn)的方法才能用于遠(yuǎn)程訪問,其余方法會被忽略:

(1)方法是導(dǎo)出的
(2)方法有兩個(gè)參數(shù),都是導(dǎo)出類型或內(nèi)建類型
(3)方法的第二個(gè)參數(shù)是指針
(4)方法只有一個(gè)error接口類型的返回值

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

其中T、T1和T2都能被encoding/gob包序列化。

方法的第一個(gè)參數(shù)代表調(diào)用者提供的參數(shù);第二個(gè)參數(shù)代表返回給調(diào)用者的參數(shù)。

方法的返回值,如果非nil,將被作為字符串回傳,在客戶端看來就和errors.New創(chuàng)建的一樣。

如果返回了錯(cuò)誤,回復(fù)的參數(shù)將不會被發(fā)送給客戶端。

代碼示例:

package mainimport ("errors""fmt""log""net""net/http""net/rpc" )// Args 參數(shù) type Args struct {A, B int }// Quotient 商、余數(shù) type Quotient struct {Quo, Rem int }// Arith 算術(shù)服務(wù) type Arith int// Multiply 乘法服務(wù) func (*Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil }// Divide 除法服務(wù) func (*Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("除數(shù)不能為零")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil }// 錯(cuò)誤檢查 func checkErr(err error) {if err != nil {log.Fatalln(err)} }func main() {//開啟服務(wù)arith := new(Arith)//使用默認(rèn)服務(wù)對象err := rpc.Register(arith)checkErr(err)//默認(rèn)路徑// const (// DefaultRPCPath = "/_goRPC_"// DefaultDebugPath = "/debug/rpc"// )rpc.HandleHTTP()//設(shè)置監(jiān)聽lis, err := net.Listen("tcp", ":1234")checkErr(err)go http.Serve(lis, nil)//客戶端請求服務(wù)client, err := rpc.DialHTTP("tcp", ":1234")checkErr(err)defer client.Close()//乘法args := &Args{A: 17, B: 3}var reply interr = client.Call("Arith.Multiply", args, &reply)checkErr(err)fmt.Printf("Arith.Multiply:%d * %d = %d\n", args.A, args.B, reply)//除法quotient := new(Quotient)call := client.Go("Arith.Divide", args, quotient, nil)<-call.Donefmt.Printf("Arith.Divide:%d / %d = %d .... %d\n", args.A, args.B, quotient.Quo, quotient.Rem) }//輸出 //Arith.Multiply:17 * 3 = 51 // Arith.Divide:17 / 3 = 5 .... 2

2、客戶端

2.1、type Client struct{}

Client類型代表RPC客戶端。

同一個(gè)客戶端可能有多個(gè)未返回的調(diào)用,也可能被多個(gè)go程同時(shí)使用。

2.2、常用方法

(1)func NewClient(conn io.ReadWriteCloser) *Client

NewClient返回一個(gè)新的Client,以管理對連接另一端的服務(wù)的請求。

(2)func Dial(network, address string) (*Client, error)

Dial在指定的網(wǎng)絡(luò)和地址與RPC服務(wù)端連接。

(3)func DialHTTP(network, address string) (*Client, error)

DialHTTP在指定的網(wǎng)絡(luò)和地址與在默認(rèn)HTTP RPC路徑監(jiān)聽的HTTP RPC服務(wù)端連接。

(4)func DialHTTPPath(network, address, path string) (*Client, error)

DialHTTPPath在指定的網(wǎng)絡(luò)、地址和路徑與HTTP RPC服務(wù)端連接。

(5)func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error

Call調(diào)用指定的方法,等待調(diào)用返回,將結(jié)果寫入reply,然后返回執(zhí)行的錯(cuò)誤狀態(tài)。

(6)func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call

Go異步的調(diào)用函數(shù)。本方法Call結(jié)構(gòu)體類型指針的返回值代表該次遠(yuǎn)程調(diào)用。

通道類型的參數(shù)done會在本次調(diào)用完成時(shí)發(fā)出信號(通過返回本次Go方法的返回值)。

如果done為nil,Go會申請一個(gè)新的通道(寫入返回值的Done字段);如果done非nil,done必須有緩沖,否則Go方法會故意崩潰。

(7)func (client *Client) Close() error

關(guān)閉客戶端。

3、服務(wù)端

3.1、type Server struct{}

rpc包提供默認(rèn)的服務(wù)對象,可直接通過“rpc.”進(jìn)行使用。

3.2、常用方法

(1)func NewServer() *Server

創(chuàng)建并返回一個(gè)*Server。

(2)func (server *Server) Register(rcvr interface{}) error

注冊服務(wù)。

如果rcvr不是一個(gè)導(dǎo)出類型的值,或者該類型沒有滿足要求的方法,Register會返回錯(cuò)誤。

Register也會使用log包將錯(cuò)誤寫入日志。

客戶端可以使用格式為"Type.Method"的字符串訪問這些方法,其中Type是rcvr的具體類型。

(3)func (server *Server) RegisterName(name string, rcvr interface{}) error

RegisterName類似Register,但使用提供的name代替rcvr的具體類型名作為服務(wù)名。

(4)func (server *Server) Accept(lis net.Listener)

Accept接收監(jiān)聽器l獲取的連接,然后服務(wù)每一個(gè)連接。

Accept會阻塞,調(diào)用者應(yīng)另開線程。

(5)func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP實(shí)現(xiàn)了回應(yīng)RPC請求的http.Handler接口。

(6)func (server *Server) HandleHTTP(rpcPath, debugPath string)

HandleHTTP注冊server的RPC信息HTTP處理器對應(yīng)到rpcPath,注冊server的debug信息HTTP處理器對應(yīng)到debugPath。

HandleHTTP會注冊到http.DefaultServeMux。之后,仍需要調(diào)用http.Serve(),一般會另開線程:"go http.Serve(l, nil)"

轉(zhuǎn)載于:https://www.cnblogs.com/dzhy/p/11086905.html

總結(jié)

以上是生活随笔為你收集整理的golang——net/rpc包学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕在线不卡 | 操操操操网 | 九九热视频免费观看 | 三级做爰在线观看视频 | 日日噜噜噜 | 中文字幕av一区二区三区谷原希美 | 欧美成人h版在线观看 | 日本中文字幕在线看 | 日日夜夜影院 | 无码精品人妻一二三区红粉影视 | 亚州欧美 | 日韩三级av| 欧美日韩黄色片 | 欧美日韩亚洲另类 | 免费看aaaaa级少淫片 | 大地资源中文在线观看免费版 | 国产成人看片 | 色干干| 国产精选一区二区三区 | 自拍偷拍第二页 | 樱花草av | 亚洲精品日本 | 黄色免费网站在线 | 亚洲一区二区三区电影 | 老汉av| 无码人妻丰满熟妇精品区 | 国产夫妻视频 | 六月丁香色婷婷 | 亚洲播放器| 国产成人av一区二区 | 色人阁五月天 | 亚洲视频免费看 | 欧美鲁 | 精品蜜桃一区二区三区 | 激情全身裸吻胸 | 国产在视频线精品视频 | 九色视频丨porny丨丝袜 | 手机在线免费av | 九九热在线观看视频 | 在线看中文字幕 | 久久免费激情视频 | 禁断介护av | 强迫凌虐淫辱の牝奴在线观看 | 超碰2019| 色婷婷av一区二区三区软件 | 亚洲视频免费播放 | 精品国产aⅴ一区二区三区四川人 | 国产成人日韩 | 亚洲日本视频在线观看 | 麻豆精品国产精华精华液好用吗 | 成人av一级 | 亚洲精品污 | 精品人妻一区二区三区潮喷在线 | 免费看aaaaa级少淫片 | 探花精品 | 精品麻豆视频 | 日日夜夜爱| 中文在线字幕观看 | 欧美极品jizzhd欧美仙踪林 | 亚洲性图视频 | 午夜看片| 国产伦精品一区二区三区88av | 国产视频不卡一区 | 韩国日本美国免费毛片 | 久久久影院| av成人在线网站 | 欧美绿帽合集xxxxx | 国产精品一区在线观看 | 激情视频国产 | 日韩性大片 | www亚洲国产| 91啪在线观看 | 日韩综合在线观看 | 亚洲五码在线 | 久久九九精品 | 亚洲国产成人自拍 | 人人插人人爽 | 亚洲 精品 综合 精品 自拍 | 天天搞夜夜爽 | 臭脚猛1s民工调教奴粗口视频 | 成年人黄色录像 | 午夜在线观看一区 | 夜夜躁狠狠躁日日躁 | 女人扒开屁股让男人捅 | 日本少妇吞精囗交 | 日产电影一区二区三区 | 欧美在线观看视频一区二区 | wwwav视频在线观看 | 日韩欧美在线一区 | 黄a在线| 日本韩国中文字幕 | 日本黄色免费在线观看 | 中文字幕久久综合 | 精品在线视频观看 | 免费成年人视频 | 国产av无码专区亚洲av毛片搜 | 日本精品一区二区三区在线观看 | 四虎在线视频 | 丁香av |