侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录
Go

golang 内置的 rpc 小 demo

zze
zze
2021-06-23 / 0 评论 / 0 点赞 / 390 阅读 / 1847 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

目录结构:

$ 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

评论区