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)  
    }
    
  • 相关阅读:
    命运(经典dp)
    A * B Problem Plus(fft)
    Hat's Fibonacci(大数加法+直接暴力)
    Can you find it?(哈希)
    String 类型与char 类型 输入
    QT 之 QMutexLocker如何安全锁住全局变量
    C语言中access/_access函数的使用实例详解
    %02x与%2x 之间的区别
    函数名&函数名取地址
    函数指针及其定义和用法,C语言函数指针详解
  • 原文地址:https://www.cnblogs.com/freebird92/p/4852358.html
Copyright © 2011-2022 走看看