• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go标准包RPC的使用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

服务端

package main

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

// rpc服务端
// 实现两个Rpc接口
// 1. 计算除数和被除数两个数的乘积,返回乘积结果
// 2. 计算除数和被除数两个数的除法结果,返回商和余数

// 请求参数结构体
type RequestParam struct {
	Dividend int // 被除数
	Divisor  int // 除数
}

// 乘积计算结果直接返回int类型

// 返回两个数的商和余数响应结构体
type DivisionResponse struct {
	Quotient  int // 商
	Remainder int // 余数
}

// 定义空结构体,用于绑定方法
type Calc struct {
}

// rpc通信中结构体结构`(request,*response) error`
// 计算乘法
func (c *Calc) Multi(req RequestParam, rsp *int) error {
	*rsp = req.Dividend * req.Divisor
	return nil
}

// 计算除法
func (c *Calc) Sub(req RequestParam, rsp *DivisionResponse) error {
	if req.Divisor == 0 {
		err := errors.New("the divisor cannot be zero")
		return err
	}

	rsp.Quotient = req.Dividend / req.Divisor
	rsp.Remainder = req.Dividend % req.Divisor
	return nil
}

func main() {
	// 注册rpc服务
	err := rpc.Register(new(Calc))
	if err != nil {
		fmt.Printf("register calc server failed, err: %v\n", err)
		return
	}
	/* 通过http方式监听rpc */
	// 设置http handle
	//rpc.HandleHTTP()

	// 启动http服务监听
	//err = http.ListenAndServe(":8080", nil)
	//if err != nil {
	//	log.Fatal("start listen failed", err)
	//}

	/* 直接通过socket方式监听rpc服务 */
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Printf("create tcp listen failed, err: %v\n", err)
		return
	}
	rpc.Accept(listener)
}

客户端

package main

import (
	"fmt"
	"net/rpc"
)

// rpc客户端

// 请求参数结构体
type RequestParam struct {
	Dividend int // 被除数
	Divisor  int // 除数
}

// 乘积计算结果直接返回int类型

// 返回两个数的商和余数响应结构体
type DivisionResponse struct {
	Quotient  int // 商
	Remainder int // 余数
}

func main() {
	/* 通过http方式监听rpc */
	//rpcClient, err := rpc.DialHTTP("tcp", "127.0.0.1:8080")
	/* 直接通过socket方式监听rpc服务 */
	rpcClient, err := rpc.Dial("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Printf("connection rpc server failed, err: %v\n", err)
		return
	}
	defer rpcClient.Close()
	// 计算乘法
	var multiResult int
	err = rpcClient.Call("Calc.Multi", RequestParam{10, 3}, &multiResult)
	if err != nil {
		fmt.Printf("call Calc.Multi failed, err: %v\n", err)
	}
	fmt.Printf("乘积: %d\n", multiResult)
	var subResult DivisionResponse
	err = rpcClient.Call("Calc.Sub", RequestParam{10, 3}, &subResult)
	if err != nil {
		fmt.Printf("call Calc.Sub failed, err: %v\n", err)
	}
	fmt.Printf("商: %d, 余数: %d\n", subResult.Quotient, subResult.Remainder)

}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
****-go机器学习-Go语言发布时间:2022-07-10
下一篇:
go常用操作发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap