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的例子给演示了下
另一种是使用NewServer
这种是当rpc已经注册的时候就要使用了另外一种了。即一个server只能在DefaultRPC中注册一种类型。
当Server使用rpc.NewServer的时候,client也需要进行下改动了
相关文章推荐
- golang两种调用rpc的方法
- Axis2 的 RPC 和 AXIOM 服务端方法的两种调用方式
- golang中的RPC调用服务器方法
- php调用web services两种方法soap and xml-rpc
- 在SE6中调用编译器的两种方法
- golang使用execCommand调用的时候子进程如何杀掉处理方法
- golang通过反射调用方法
- PHP中调用Java类的两种方法
- C++调用DLL有两种方法——静态调用和动态调用
- Laravel控制器调用model的两种方法
- C#调用C++ dll的两种方法
- HttpWebRequest调用接口的方法两种写法
- iOS调用系统发短信的两种方法
- JAVA用JNI方法调用C代码实现HelloWorld(含windows及ubuntu两种操作系统环境下的操作)
- [PostgreSQL] PG客户端调用sql脚本的两种方法
- WCF 客户端调用服务操作的两种方法
- 易语言- 调用API两种方法移动鼠标 SetCursorPos mouse_event
- PHP程序调用java类的两种方法
- Java SE6调用Java编译器的两种新方法
- [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)