美文网首页
Golang jsonrpc

Golang jsonrpc

作者: 钾肥尔德 | 来源:发表于2020-02-17 15:33 被阅读0次

    Server

    package main
    
    import (
        "fmt"
        "github.com/pkg/errors"
        "log"
        "net"
        "net/rpc"
        "net/rpc/jsonrpc"
        "os"
    )
    
    type Arith struct {
    
    }
    
    type ArithRequest struct {
        A int
        B int
    }
    
    type ArithResponse struct {
        Pro int
        Que int
        Rem int
    }
    
    func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
        res.Pro = req.A * req.B
        return nil
    }
    
    func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
        if req.B == 0 {
            return errors.New("divide by zero")
        }
        res.Que = req.A / req.B
        res.Rem = req.A % req.B
        return nil
    }
    
    func (this *Arith) Add(a int, b *int) error {
        *b = a + 5
        return nil
    }
    
    func main() {
        rpc.Register(new(Arith))
    
        lis, err := net.Listen("tcp", "127.0.0.1:8096")
        if err != nil {
            log.Fatalln("fatal error: ", err)
        }
        fmt.Fprintf(os.Stdout, "%s", "start connection\n")
    
        for {
            conn, err := lis.Accept()
            if err !=  nil {
                fmt.Fprintf(os.Stdout, "%s", err)
                continue
            }
    
            go func(conn net.Conn) {
                fmt.Fprintf(os.Stdout, "%s", "new client in coming\n")
                jsonrpc.ServeConn(conn)
            }(conn)
        }
    }
    

    client-go

    package main
    
    import (
        "fmt"
        "log"
        "net/rpc/jsonrpc"
    )
    
    type ArithRequest struct {
        A int
        B int
    }
    
    type ArithResponse struct {
        Pro int
        Que int
        Rem int
    }
    
    func main() {
        conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8096")
        if err != nil{
            log.Fatalln("dailing error: ", err)
        }
    
        req := ArithRequest{9,2}
        var res ArithResponse
    
        err = conn.Call("Arith.Multiply", req, &res)
        if err != nil {
            log.Fatalln("arith error: ", err)
        }
        fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
    
        err = conn.Call("Arith.Divide", req, &res)
        if err != nil {
            log.Fatalln("arith error: ", err)
        }
        fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Que, res.Rem)
    }
    

    client-python

    import json
    import requests
    import socket
    
    host = "127.0.0.1"
    port = 8096
    addr = (host, port)
    tcpCliSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    req = {"A":9, "B": 2}
    
    def main():
        add = {
                "method": "Arith.Add",
                "params": [71],
                "id": 0
            }    
    
        multiply = {
            "method": "Arith.Multiply",
            "params": [req],
            "id": 1
        }
        
        divide = {
            "method": "Arith.Divide",
            "params": [req],
            "id": 2
        }
        
        tcpCliSock.connect(addr)
        
        tcpCliSock.send(json.dumps(add).encode())
        data_add = tcpCliSock.recv(2048)
        print(data_add.decode())
    
        tcpCliSock.send(json.dumps(multiply).encode())
        data_multiply = tcpCliSock.recv(2048)
        print(data_multiply.decode())
        
        tcpCliSock.send(json.dumps(divide).encode())
        data_divide = tcpCliSock.recv(2048)
        print(data_divide.decode())
    
    
    if __name__ == "__main__":
        main()
    

    相关文章

      网友评论

          本文标题:Golang jsonrpc

          本文链接:https://www.haomeiwen.com/subject/tkgbfhtx.html