zoukankan      html  css  js  c++  java
  • golang rpc的两种调用方法

    golang的rpc有两种方法进行调用,一种是rpc例子中给的:

    package main
    
    import (
            "net/rpc"
            "net/http"
            "log"
            "net"
            "time"
    )
    
    
    type Args struct {
            A, B int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *([]string)) error {
            *reply = append(*reply, "test")
            return nil
    }
    
    func main() {
            arith := new(Arith)
    
            rpc.Register(arith)
            rpc.HandleHTTP()
            
            l, e := net.Listen("tcp", ":1234")
            if e != nil {
                    log.Fatal("listen error:", e)
            }
            go http.Serve(l, nil)
            time.Sleep(5 * time.Second)
    
            client, err := rpc.DialHTTP("tcp", "127.0.0.1" + ":1234")
            if err != nil {
                    log.Fatal("dialing:", err)
            }
            
            args := &Args{7,8}
            reply := make([]string, 10)
            err = client.Call("Arith.Multiply", args, &reply)
            if err != nil {
                    log.Fatal("arith error:", err)
            }
            log.Println(reply)
    }

    另一种是使用NewServer

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

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

    package main
    
    import (
            "net/rpc"
            //"net/http"
            "log"
            "net"
            "time"
    )
    
    
    type Args struct {
            A, B int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *([]string)) error {
            *reply = append(*reply, "test")
            return nil
    }
    
    func main() {
            newServer := rpc.NewServer()
            newServer.Register(new(Arith))
    
            l, e := net.Listen("tcp", "127.0.0.1:1234") // any available address
            if e != nil {
                    log.Fatalf("net.Listen tcp :0: %v", e)
            }
    
            go newServer.Accept(l)
            newServer.HandleHTTP("/foo", "/bar")
            time.Sleep(2 * time.Second)
    
            address, err := net.ResolveTCPAddr("tcp", "127.0.0.1:1234")
            if err != nil {
                    panic(err)
            }
            conn, _ := net.DialTCP("tcp", nil, address)
            defer conn.Close()
    
            client := rpc.NewClient(conn)
            defer client.Close()
    
            args := &Args{7,8}
            reply := make([]string, 10)
            err = client.Call("Arith.Multiply", args, &reply)
            if err != nil {
                    log.Fatal("arith error:", err)
            }
            log.Println(reply)
    }
    第二个例子中的
    newServer.HandleHTTP("/foo", "/bar") 
    可以任意设置,第一个例子其实是设置了默认的两个
     
    这里也顺便将reply作为[]slice的例子给演示了下
     

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    Visual Studio for Application 内幕之二(转载)
    查找数组中极值
    .net中HashTable的最大容量
    返回数组中所有元素被第一个元素除的结果
    将json转换为DataTable
    ASP.NET面试题(推荐_有答案) FX
    [转]U盘启动制作工具|大白菜启动制作工具
    使用QFileDialog 同时选择 文件和文件夹
    [转]如何用SQL命令修改字段名称
    小朋友 老师 笑话
  • 原文地址:https://www.cnblogs.com/yjf512/p/2937261.html
Copyright © 2011-2022 走看看