go实现rpc

2022-10-12  本文已影响0人  耍帅oldboy

1、服务端

package main

import (
    "fmt"
    "net"
    "net/http"
    "net/rpc"
)

type Server struct {
}

type Req struct {
    NumOne int
    NumTow int
}

type Res struct {
    Num int
}

func (s *Server) Add(req Req, res *Res) error {
    res.Num = req.NumOne + req.NumTow
    return nil
}

func main() {
    rpc.Register(new(Server))
    rpc.HandleHTTP()
    l, err := net.Listen("tcp", ":8888")
    if err != nil {
        fmt.Println(err)
        return
    }
    http.Serve(l, nil)
}

2、客户端

package main

import (
    "fmt"
    "net/rpc"
)

type Req struct {
    NumOne int
    NumTow int
}

type Res struct {
    Num int
}

func main() {
    req := Req{
        NumOne: 1,
        NumTow: 2,
    }
    var res Res
    client, err := rpc.DialHTTP("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Println(err)
        return
    }
    // 同步调用
    //client.Call("Server.Add", req, &res)
    //fmt.Println(res)
    //异步调用
    ca := client.Go("Server.Add", req, &res, nil)
    for {
        select {
        case <-ca.Done:
            fmt.Println(res)
            return
        default:
            fmt.Println("处理别的任务")
        }
    }

}


上一篇下一篇

猜你喜欢

热点阅读