zoukankan      html  css  js  c++  java
  • 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);
    }
    

      

  • 相关阅读:
    month(字段)、year(字段)
    简单音乐播放器实现
    Mp3音乐文件列表实现
    读取SD卡中所有MP3文件
    java基础复习 之 多态
    JavaWeb学习过程 之c3p0的使用
    JavaWeb学习过程 之MVC模式下的查询
    行转列:总结
    如何快速禁用约束 (解决ORA-O2266问题)
    PLSQL Developer 11 使用技巧(持续更新)
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9342567.html
Copyright © 2011-2022 走看看