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语言程序设计有所帮助。