目录结构:
$ tree t5_rpc/
t5_rpc/
├── client.go
├── go.mod
├── objs
│ └── objs.go
└── server.go
1 directory, 4 files
go.mod
module t5_rpc
go 1.16
objs/objs.go
package objs
type RPCRequest struct {
Left int
Right int
}
type RPCResponse struct {
Result int
}
type Calc struct{}
func (c *Calc) Sum(req *RPCRequest, resp *RPCResponse) error {
resp.Result = req.Left + req.Right
return nil
}
server.go
package main
import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"os"
"t5_rpc/objs"
)
func main() {
// 注册 RPC 服务
rpc.Register(&objs.Calc{})
server, err := net.Listen("tcp", ":9999")
if err != nil {
fmt.Println(err)
os.Exit(-1)
}
defer server.Close()
for {
client, err := server.Accept()
if err == nil {
jsonrpc.ServeConn(client)
}
}
}
client.go
package main
import (
"fmt"
"net/rpc/jsonrpc"
"t5_rpc/objs"
)
func main() {
client, err := jsonrpc.Dial("tcp", "127.0.0.1:9999")
if err == nil {
req := objs.RPCRequest{5, 10}
var resp objs.RPCResponse
err := client.Call("Calc.Sum", &req, &resp)
if err == nil {
fmt.Println(resp.Result)
} else {
fmt.Println(err)
}
} else {
fmt.Println(err)
}
}
一个终端运行服务端:
$ go run server.go
一个终端运行客户端:
$ go run client.go
15
评论区