zoukankan      html  css  js  c++  java
  • GO RPC

    HTTP RPC

    SERVER CODE

    package main
    
    import (
    "errors"
    "fmt"
    "net/http"
    "net/rpc"
    )
    
    const (
        URL = "192.168.2.172:12981"
    )
    
    type Args struct {
        A, B int
    }
    
    type Quotient struct {
        Quo, Rem int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *int) error {
        *reply = args.A * args.B
        return nil
    }
    func (t *Arith) Divide(args *Args, quo *Quotient) error{
        if args.B == 0 {
            return errors.New("divide by zero!")
        }
    
        quo.Quo = args.A / args.B
        quo.Rem = args.A % args.B
    
        return nil
    }
    func main() {
    
        arith := new(Arith)
        rpc.Register(arith)
        rpc.HandleHTTP()
    
        err := http.ListenAndServe(URL, nil)
        if err != nil {
            fmt.Println(err.Error())
        }
    }
    

     client code

    package main
    
    import (
        "fmt"    
        "net/rpc”
    )
    
    const (
        URL = "192.168.2.172:12982"
    )
    
    func main() {
    
        client, err := rpc.DialHTTP("tcp", URL)
        if err != nil {
            fmt.Println(err.Error())
        }
    
        args := Args{2, 4}
        var reply int
        err = client.Call("Arith.Multiply", &args, &reply)
    
        if err != nil {
            fmt.Println(err.Error())
        } else {
            fmt.Println(reply)
        }
    }   
    

     二 JSON-RPC

    server code

    package main
    
    import (
    "errors"
    "fmt"
    "net"
    "net/rpc"
    "net/rpc/jsonrpc"
    )
    
    const (
        URL= "192.168.2.172:12981"
    )
    
    type Args struct {
        A, B int
    }
    type Quotient struct {
        Quo, Rem int
    }
    
    type Arith int
    
    func (t *Arith) Multiply(args *Args, reply *int) error {
        *reply = args.A * args.B
        return nil
    }
    func (t *Arith) Divide(args *Args, quo *Quotient) error {
        if args.B == 0 {
            return errors.New("divide by zero!")
        }
    
        quo.Quo = args.A / args.B
        quo.Rem = args.A % args.B
    
        return nil
    }
    func main() {
    
        arith := new(Arith)
        rpc.Register(arith)
    
        tcpAddr, err := net.ResolveTCPAddr("tcp", URL)
        if err != nil {
            fmt.Println(err)
        }
        listener, err := net.ListenTCP("tcp", tcpAddr)
    
        for {
            conn, err := listener.Accept()
            if err != nil {
                continue
            }
            go jsonrpc.ServeConn(conn)
        }
    }
    

     client code

    package main
    
    import (
        "fmt"    
        "net/rpc”
    )
    
    const (
        URL = "192.168.2.172:12982"
    )
    
    func main() {
    
        client, err := jsonrpc.Dial("tcp", URL)
        defer client.Close()
    
        if err != nil {
            fmt.Println(err)
        }
    
        args := Args{7, 2}
        var reply int
        err = client.Call("Arith.Multiply", &args, &reply)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(reply)  
    }
    
  • 相关阅读:
    例行性工作排程 (crontab)
    数组
    继续我们的学习。这次鸟哥讲的是LVM。。。磁盘管理 最后链接文章没有看
    htop资源管理器
    转:SSL协议详解
    转:SSL 握手协议详解
    转:Connection reset原因分析和解决方案
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
    转:logback的使用和logback.xml详解
    转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2
  • 原文地址:https://www.cnblogs.com/freebird92/p/4852358.html
Copyright © 2011-2022 走看看