golang两种调用rpc的方法
本文实例讲述了golang两种调用rpc的方法。分享给大家供大家参考,具体如下:
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的例子给演示了下
希望本文所述对大家Go语言程序设计有所帮助。