您的位置:首页 > 编程语言 > Go语言

golang rpc的两种调用方法

2013-02-28 17:20 281 查看
golang的rpc有两种方法进行调用,一种是rpc例子中给的:

packagemain import( "net/rpc" "net/http" "log" "net" "time" ) typeArgsstruct{ A,Bint } typeArithint func(t*Arith)Multiply(args*Args,reply*([]string))error{ *reply=append(*reply,"test") returnnil } funcmain(){ arith:=new(Arith) rpc.Register(arith) rpc.HandleHTTP() l,e:=net.Listen("tcp",":1234") ife!=nil{ log.Fatal("listenerror:",e) } gohttp.Serve(l,nil) time.Sleep(5*time.Second) client,err:=rpc.DialHTTP("tcp","127.0.0.1"+":1234") iferr!=nil{ log.Fatal("dialing:",err) } args:=&Args{7,8} reply:=make([]string,10) err=client.Call("Arith.Multiply",args,&reply) iferr!=nil{ log.Fatal("aritherror:",err) } log.Println(reply) }

另一种是使用NewServer

这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRPC中注册一种类型。

当Server使用rpc.NewServer的时候,client也需要进行下改动了

packagemain import( "net/rpc" //"net/http" "log" "net" "time" ) typeArgsstruct{ A,Bint } typeArithint func(t*Arith)Multiply(args*Args,reply*([]string))error{ *reply=append(*reply,"test") returnnil } funcmain(){ newServer:=rpc.NewServer() newServer.Register(new(Arith)) l,e:=net.Listen("tcp","127.0.0.1:1234")//anyavailableaddress ife!=nil{ log.Fatalf("net.Listentcp:0:%v",e) } gonewServer.Accept(l) newServer.HandleHTTP("/foo","/bar") time.Sleep(2*time.Second) address,err:=net.ResolveTCPAddr("tcp","127.0.0.1:1234") iferr!=nil{ panic(err) } conn,_:=net.DialTCP("tcp",nil,address) deferconn.Close() client:=rpc.NewClient(conn) deferclient.Close() args:=&Args{7,8} reply:=make([]string,10) err=client.Call("Arith.Multiply",args,&reply) iferr!=nil{ log.Fatal("aritherror:",err) } log.Println(reply) }第二个例子中的newServer.HandleHTTP("/foo","/bar")可以任意设置,第一个例子其实是设置了默认的两个这里也顺便将reply作为[]slice的例子给演示了下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: