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/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    双色球随机一注
    if else的简写
    select
    预解析
    json
    数组方法
    arguments
    国密SM4算法
    AES算法
    Feistel算法结构与DES加密算法
  • 原文地址:https://www.cnblogs.com/yjf512/p/2937261.html
Copyright © 2011-2022 走看看