go语言RPC

RPC remote procedure call,远程过程调用。

Go语言对RPC的支持有以下要求:

1.以对象形式注册RPC

2.RPC函数必须是对象的公共函数。public,也就是首字母大写的函数

3.RPC函数必须有2个参数,类型为公共类型,或go内嵌类型。

4.RPC函数第2个参数作为返回值,必须是指针类型。

5.RPC函数必须返回一个error类型的值。

 

func (this *T) MethodName(args T1,reply *T2) error 

 

默认以gob经行数据编码与解码。

 

TCP连接

 

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /**  
  2.  * Created by Administrator on 13-12-31.  
  3.  */  
  4. package main  
  5.   
  6. import (  
  7.     "errors"  
  8.     "net/rpc"  
  9.     "net"  
  10.     "fmt"  
  11.     "os"  
  12. )  
  13.   
  14. type Args struct {  
  15.     I , J int  
  16. }  
  17.   
  18. type MyMethod int  
  19.   
  20. func (this *MyMethod) Mult(args *Args, reply *int) error {  
  21.     if args == nil || reply == nil {  
  22.         return errors.New("nil paramters !")  
  23.     }  
  24.     *reply = args.I*args.J  
  25.     return nil  
  26. }  
  27.   
  28. type DivResult struct {  
  29.     Quo, Rem int  
  30. }  
  31.   
  32. func (this *MyMethod) Div(args *Args, reply *DivResult) error{  
  33.     if args == nil || reply == nil {  
  34.         return errors.New("nil paramters !")  
  35.     }  
  36.     if  args.J == 0 {  
  37.         return errors.New("/0 !")  
  38.     }  
  39.     reply.Quo = args.I / args.J  
  40.     reply.Rem = args.I % args.J  
  41.     return nil  
  42. }  
  43.   
  44. func main() {  
  45.     mm := new(MyMethod)  
  46.     server := rpc.NewServer()  
  47.     server.Register(mm)  
  48.   
  49.     listener, err := net.Listen("tcp",":7777")  
  50.         defer listener.Close()  
  51.   
  52.     if err != nil {  
  53.         fmt.Fprintf(os.Stderr, "error %s\n", err.Error())  
  54.         return  
  55.     }  
  56.     server.Accept(listener)  
  57. }  
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /**  
  2.  * Created by Administrator on 13-12-31.  
  3.  */  
  4. package main  
  5.   
  6. import (  
  7.     "net/rpc"  
  8.     "fmt"  
  9.     "os"  
  10. )  
  11.   
  12. type Args struct {  
  13.     I , J int  
  14. }  
  15.   
  16. type MyMethod int  
  17.   
  18. //func (this *MyMethod) Mult(args *Args, reply *int) error {  
  19. //  if args == nil || reply == nil {  
  20. //      return errors.New("nil paramters !")  
  21. //  }  
  22. //  *reply = args.I*args.J  
  23. //  return nil  
  24. //}  
  25.   
  26. type DivResult struct {  
  27.     Quo, Rem int  
  28. }  
  29.   
  30. //func (this *MyMethod) Div(args *Args, reply *DivResult) {  
  31. //  reply.Quo = args.I / args.J  
  32. //  reply.Rem = args.J % args.J  
  33. //}  
  34.   
  35. func main() {  
  36.     pClient, err := rpc.Dial("tcp", "127.0.0.1:7777")  
  37.     if err != nil {  
  38.         fmt.Fprintf(os.Stderr, "err : %s\n", err.Error())  
  39.         return  
  40.     }  
  41. <span >  defer pClient.Close()</span>  
  42.   
  43.     // 同步RPC  
  44.     var multResult int  
  45.     err = pClient.Call("MyMethod.Mult", &Args{2, 7}, &multResult)  
  46.     if err != nil {  
  47.         fmt.Fprintf(os.Stderr, "err : %s\n", err.Error())  
  48.         return  
  49.     }  
  50.     fmt.Fprintf(os.Stdout, "multResult = %d\n", multResult)  
  51.   
  52.     // 异步RPC  
  53.     var divResult DivResult  
  54.     pCall := pClient.Go("MyMethod.Div", &Args{5, 2}, &divResult, nil)  
  55.     if pCall != nil {  
  56.         fmt.Fprintf(os.Stderr, "pCall : %v  %v\n", pCall, pCall.Reply)  
  57.         if replyCall, ok := <-pCall.Done; ok {  
  58.             fmt.Fprintf(os.Stderr, "replyCall : %v  %v\n", replyCall, replyCall.Reply)  
  59.         }  
  60.   
  61.     }  
  62.   
  63. }  
posted on 2016-11-02 14:54  snowtrace  阅读(224)  评论(0)    收藏  举报