本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名原文链接~~~

golang 内置的 rpc 小 demo

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:


目录结构:

$ 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
# Go 基础  

如果这篇文章对您有帮助,可点击下方链接分享给你的朋友们😋,如果遇到问题欢迎评论、留言~~~😇

评论

公众号:zze_coding

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×