博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go语言net包rpc远程调用的使用
阅读量:6655 次
发布时间:2019-06-25

本文共 3684 字,大约阅读时间需要 12 分钟。

一、基于http的RPC

服务端:

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{}//函数必须是导出的//必须有两个导出类型参数//第一个参数是接收参数//第二个参数是返回给客户端参数,必须是指针类型//函数还要有一个返回值errorfunc (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);	}}

客户端:

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);}

二、基于tcp的RPC

服务端:

package main;import (	"net"	"log"	"net/rpc")//注意字段必须是导出type Params struct {	Width, Height int;}type Rect struct{}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 chkError(err error) {	if err != nil {		log.Fatal(err);	}}func main() {	rect := new(Rect);	//注册rpc服务	rpc.Register(rect);	//获取tcpaddr	tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");	chkError(err);	//监听端口	tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);	chkError(err2);	//死循环处理连接请求	for {		conn, err3 := tcplisten.Accept();		if err3 != nil {			continue;		}		//使用goroutine单独处理rpc连接请求		go rpc.ServeConn(conn);	}}

客户端:

package main;import (	"net/rpc"	"fmt"	"log")type Params struct {	Width, Height int;}func main() {	//连接远程rpc服务	//这里使用Dial,http方式使用DialHTTP,其他代码都一样	rpc, err := rpc.Dial("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);}

三、JSON RPC 方式

jsonrpc方式是数据编码采用了json,而不是gob编码。

服务端:

package main;import (	"net"	"log"	"net/rpc"	"net/rpc/jsonrpc")//注意字段必须是导出type Params struct {	Width, Height int;}type Rect struct{}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 chkError(err error) {	if err != nil {		log.Fatal(err);	}}func main() {	rect := new(Rect);	//注册rpc服务	rpc.Register(rect);	//获取tcpaddr	tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8080");	chkError(err);	//监听端口	tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);	chkError(err2);	for {		conn, err3 := tcplisten.Accept();		if err3 != nil {			continue;		}		//使用goroutine单独处理rpc连接请求		//这里使用jsonrpc进行处理		go jsonrpc.ServeConn(conn);	}}

客户端:

package main;import (	"fmt"	"log"	"net/rpc/jsonrpc")type Params struct {	Width, Height int;}func main() {	//连接远程rpc服务	//这里使用jsonrpc.Dial	rpc, err := jsonrpc.Dial("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);}

转载于:https://www.cnblogs.com/jkko123/p/7039675.html

你可能感兴趣的文章
javascript三元操作符
查看>>
typedef与define的区别
查看>>
根据外键名称获取外键表名
查看>>
(实用)win7/8修改远程桌面连接默认端口
查看>>
WCF实现REST服务
查看>>
make软件包安装
查看>>
页面开机自启动,页面置顶显示,页面持续获得焦点,鼠标点击器源码
查看>>
centos7配置mono和jexus5.6.2
查看>>
My 1st webUI try
查看>>
多核CPU硬件架构介绍
查看>>
mac 浏览器 强刷快捷键
查看>>
[转载]SQL Server行列转换实现
查看>>
Mysql之Centos6.5+Mysql5.6搭建配置
查看>>
Micropython TurnipBit 吃豆小人
查看>>
第一次写JQuery插件--用于显示子菜单
查看>>
如何实现居中对齐
查看>>
iOS面试题(四)
查看>>
PackageInfo、ResolveInfo
查看>>
sphinx详细安装配置文档
查看>>
【spring boot】【redis】spring boot 集成redis的发布订阅机制
查看>>