zoukankan      html  css  js  c++  java
  • Go语言使用net库进行远程过程调用

    文件结构:

    │
    ├─rpc_client
    │      rpc_client.go
    │
    ├─rpc_protocol
    │      rpc_protocol.go
    │
    └─rpc_server
            rpc_server.go
    

    协议

    //rpc_protocol.go
    package RpcProtocol
    
    // 算数运算请求结构体
    type ArithRequest struct {
    	A int
    	B int
    }
    
    // 算数运算响应结构体
    type ArithResponse struct {
    	Pro int // 乘积
    	Quo int // 商
    	Rem int // 余数
    }
    

    服务端

    //rpc_server.go
    package main
    
    import (
    	"errors"
    	"fmt"
    	"log"
    	"net"
    	"net/http"
    	"net/rpc"
    	"os"
    	"net_rpc/rpc_protocol"
    )
    
    // 算数运算结构体
    type Arith struct {
    }
    
    // 乘法运算方法
    func (this *Arith) Multiply(req RpcProtocol.ArithRequest, res *RpcProtocol.ArithResponse) error {
    	res.Pro = req.A * req.B
    	return nil
    }
    
    // 除法运算方法
    func (this *Arith) Divide(req RpcProtocol.ArithRequest, res *RpcProtocol.ArithResponse) error {
    	if req.B == 0 {
    		return errors.New("divide by zero")
    	}
    	res.Quo = req.A / req.B
    	res.Rem = req.A % req.B
    	return nil
    }
    
    func main() {
    	rpc.Register(new(Arith)) // 注册rpc服务
    	rpc.HandleHTTP()         // 采用http协议作为rpc载体
    
    	lis, err := net.Listen("tcp", "127.0.0.1:8095")
    	if err != nil {
    		log.Fatalln("fatal error: ", err)
    	}
    
    	fmt.Fprintf(os.Stdout, "%s", "start connection")
    
    	http.Serve(lis, nil)
    }
    

    客户端

    //rpc_client.go
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/rpc"
    	"net_rpc/rpc_protocol"
    )
    
    func main() {
    	conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8095")
    	if err != nil {
    		log.Fatalln("dailing error: ", err)
    	}
    
    	req := RpcProtocol.ArithRequest{9, 2}
    	var res RpcProtocol.ArithResponse
    
    	err = conn.Call("Arith.Multiply", req, &res) // 乘法运算
    	if err != nil {
    		log.Fatalln("arith error: ", err)
    	}
    	fmt.Printf("%d * %d = %d
    ", req.A, req.B, res.Pro)
    
    	err = conn.Call("Arith.Divide", req, &res)
    	if err != nil {
    		log.Fatalln("arith error: ", err)
    	}
    	fmt.Printf("%d / %d, quo is %d, rem is %d
    ", req.A, req.B, res.Quo, res.Rem)
    }
    
  • 相关阅读:
    VUE权限列表控制
    VUE-element-UI修改内置样式
    微信开发-url地址传值踩坑
    git 上传命令
    微信开发-缩略图插件
    axios拦截器
    设置contentType
    JSON.parse 函数应用 (复制备忘)
    angularjs开发遇到的坑
    http 请求头
  • 原文地址:https://www.cnblogs.com/liutongqing/p/13595067.html
Copyright © 2011-2022 走看看