• go语言net包rpc远程调用的使用


    go语言net包rpc远程调用的使用 - 怀素真 - 博客园 https://www.cnblogs.com/jkko123/p/7039675.html

    myRpcServer.go

    package main
    import (
    	"net/rpc"
    	"net/http"
    	"log"
    )
    
    //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC
    //go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码
    
    //注意字段必须是导出
    type Params struct {
    	Width, Height int;
    }
    
    type Rect struct{}
    
    //函数必须是导出的
    //必须有两个导出类型参数
    //第一个参数是接收参数
    //第二个参数是返回给客户端参数,必须是指针类型
    //函数还要有一个返回值error
    func (r *Rect) Area(p Params, ret *int) error {
    	*ret = p.Width * p.Height;
    	return nil;
    }
    
    func (r *Rect) Perimeter(p Params, ret *int) error {
    	*ret = (p.Width + p.Height) * 2;
    	return nil;
    }
    
    func main() {
    	rect := new(Rect);
    	//注册一个rect服务
    	rpc.Register(rect);
    	//把服务处理绑定到http协议上
    	rpc.HandleHTTP();
    	err := http.ListenAndServe(":8080", nil);
    	if err != nil {
    		log.Fatal(err);
    	}
    }
    

      

    myRpcClient.go

    package main
    import (
    	"net/rpc"
    	"log"
    	"fmt"
    )
    
    type Params struct {
    	Width, Height int;
    }
    
    func main() {
    	//连接远程rpc服务
    	rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080");
    	if err != nil {
    		log.Fatal(err);
    	}
    	ret := 0;
    	//调用远程方法
    	//注意第三个参数是指针类型
    	err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret);
    	if err2 != nil {
    		log.Fatal(err2);
    	}
    	fmt.Println(ret);
    	err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret);
    	if err3 != nil {
    		log.Fatal(err3);
    	}
    	fmt.Println(ret);
    }
    

      

  • 相关阅读:
    (转)ubuntu 对拍和基本操作
    一个在线翻译LateX的网站
    51nod 1376: 最长递增子序列的数量(二维偏序+cdq分治)
    BZOJ1087: [SCOI2005]互不侵犯King(状态压缩动态规划)
    ZOJ Problem Set
    bzoj2301:[HAOI2011]Problem b(容斥+莫比乌斯反演+分块)
    BZOJ 4318 OSU!期望DP
    CodeForces 235B Let's Play Osu!(概率)
    博客界面美化
    A+B Problem
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9342567.html
Copyright © 2020-2023  润新知