侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 709 篇文章
  • 累计创建 62 个标签
  • 累计收到 27 条评论

目 录CONTENT

文章目录
Go

golang 内置的 rpc 小 demo

张种恩
2021-06-23 / 0 评论 / 0 点赞 / 157 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-06-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

目录结构:

$ 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
0

评论区