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)
    }
    
  • 相关阅读:
    ubuntu下搭建lnmp
    mysql常用命令
    nginx 配置 location 语法 正则表达式
    网站策划方案写作、演示标准[转]
    WEB3.0标准的核心
    也谈论坛“BBS2.0”的十大升级方向 [网摘]
    未来网站策划呈现5大趋势 [网摘]
    关于Web 2.0 网站的创业思考[转]
    关于web3.0的标准:吃喝买卖随己
    左右均自适应高度
  • 原文地址:https://www.cnblogs.com/liutongqing/p/13595067.html
Copyright © 2011-2022 走看看