当前位置:网站首页>rpc-remote procedure call demo
rpc-remote procedure call demo
2022-08-05 02:57:00 【ALEX_CYL】
RPC:Remote Procedure Call
rpc对函数的要求:
1.字母大写,即要求是public
2.含有两个可导出类型的参数,返回给客户端的参数必须是指针类型
3.函数必须有一个返回值 error
server demo:
package main
import (
"errors"
"fmt"
"net/http"
"net/rpc"
)
type Args struct {
A, B int
}
type Query struct {
X, Y int
}
type Last int
func (t *Last) Multiply(args Args, reply *int) error {
*reply = args.A * args.B
fmt.Println(*reply, "Multiply exec")
if *reply == 0 {
return fmt.Errorf("%v中存在零值", args)
}
return nil
}
func (t *Last) Divide(args Args, query *Query) error {
if args.B == 0 {
return errors.New("分子args.B = 0")
}
query.X = args.A / args.B
query.Y = args.A % args.B
fmt.Println(*query, "Divide exec")
return nil
}
func main() {
La := new(Last)
fmt.Println("la", La)
// 类型注册
// Register在DefaultServer中发布接接收类型的方法。
rpc.Register(La)
// HandleHTTP在DefaultRPCPath上为RPC消息向DefaultServer注册了一个HTTP处理器,
// 在DefaultDebugPath上注册了一个调试处理器。
// 仍然需要调用http.Serve()
rpc.HandleHTTP() //设定http类型
err := http.ListenAndServe("127.0.0.1:8080", nil)
defer func() {
err := recover()
if err != nil {
fmt.Println("panic() happend,err:", err)
}
}()
if err != nil {
panic(err)
}
}
client demo:
package main
import (
"fmt"
"net/rpc"
)
type Args struct {
A, B int
}
type Query struct {
X, Y int
}
func main() {
serverIp := "127.0.0.1:8080"
client, err := rpc.DialHTTP("tcp", serverIp)
if err != nil {
fmt.Println(err)
}
i1 := 12
i2 := 13
args := Args{
i1, i2}
var reply int
err = client.Call("Last.Multiply", &args, &reply)
if err != nil {
fmt.Println(err)
}
fmt.Println(args.A, "*", args.B, "=", reply)
var query Query
err = client.Call("Last.Divide", args, &query)
if err != nil {
fmt.Println(err)
}
fmt.Println(args.A, "/", args.B, "=", query.X)
fmt.Println(args.A, "%", args.B, "=", query.Y)
}
边栏推荐
- How to simulate the background API call scene, very detailed!
- The pit of std::string::find return value
- [Decryption] Can the NFTs created by OpenSea for free appear in my wallet without being chained?
- 1873. 计算特殊奖金
- 基于左序遍历的数据存储实践
- What should I do if the self-incrementing id of online MySQL is exhausted?
- C student management system Insert the student node at the specified location
- 人人都在说的数据中台,你需要关注的核心特点是什么?
- Review 51 MCU
- 627. 变更性别
猜你喜欢

【 genius_platform software platform development 】 : seventy-six vs the preprocessor definitions written cow force!!!!!!!!!!(in the other groups conding personnel told so cow force configuration to can

leetcode 15

Common hardware delays

QT语言文件制作

A small tool to transfer files using QR code - QFileTrans 1.2.0.1

word column notes

VSCode Change Default Terminal 如何修改vscode的默认terminal

mysql can't Execute, please solve it

Is your data safe in this hyperconnected world?

Cloud Native (32) | Introduction to Platform Storage System in Kubernetes
随机推荐
人人都在说的数据中台,你需要关注的核心特点是什么?
Apache DolphinScheduler, a new generation of distributed workflow task scheduling platform in practice - Medium
Talking about data security governance and privacy computing
Use @Mapper to query the partition status of oracle and report an error
Hash table lookup (hash table)
The Tanabata copywriting you want has been sorted out for you!
Ant Sword Advanced Module Development
UOS系统下ksql应用缺少动态库”libtinfo.so.5“问题
Images using redis cache Linux master-slave synchronization server hard drive full of moved to the new directory which points to be modified
How Jin Cang database correctness verification platform installation file
Chinese characters to Pinyin
post-study program
沃谈小知识 |“远程透传”那点事儿
word column notes
你要的七夕文案,已为您整理好!
Introduction to SDC
How to simulate the background API call scene, very detailed!
2022-08-04:输入:去重数组arr,里面的数只包含0~9。limit,一个数字。 返回:要求比limit小的情况下,能够用arr拼出来的最大数字。 来自字节。
云原生(三十二) | Kubernetes篇之平台存储系统介绍
QT: The Magical QVarient