go语言net包rpc远程调用的使用
一、基于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{} //函数必须是导出的
//必须有两个导出类型参数
//第一个参数是接收参数
//第二个参数是返回给客户端参数,必须是指针类型
//函数还要有一个返回值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);
}
}
客户端:
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);
}


go语言net包rpc远程调用的使用的更多相关文章
- 測试JSON RPC远程调用(JSONclient)
#include <string> #include <iostream> #include <curl/curl.h> /* 标题:JSonclient Auth ...
- 使用Socket&反射&Java流操作进行方法的远程调用(模拟RPC远程调用)
写在前面 阅读本文首先得具备基本的Socket.反射.Java流操作的基本API使用知识:否则本文你可能看不懂... 服务端的端口监听 进行远程调用,那就必须得有客户端和服务端.服务端负责提供服务,客 ...
- 从0到1:全面理解RPC远程调用
上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...
- Openstack Nova 源码分析 — RPC 远程调用过程
目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...
- rpc远程调用开发
RPC即远程过程调用,适用于集群管理,集群节点就是RPCServer,而我们发起远程调用的web服务器就是RPCClient.所以是少数rpcClient(可能一个)对多个RPCServer(集群节点 ...
- dubbo集成zookeeper rpc远程调用
注:下面使用dubbo依赖的是zookeeper注册中心,这里没有详细的介绍.在配置之前,请自行准备好zookeeper环境. 后续如果写zookeeper的配置会补放链接 添加Gradle依赖 co ...
- 详解RPC远程调用和消息队列MQ的区别
PC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制. RPC框架 知名度较高的有Thrift(FB的).dubbo(阿里的). RP ...
- 基于http协议实现RPC远程调用
今天简单说一下基本Http协议来实现RPC框架~ 基于Http协议实现RPC框架: 优点: 1.简单.实用.开发方便 缺点: 1.性能不是很稳定,在海量数据时,完全顶不住,容易宕机 2.因为不是走的注 ...
- netcore 基于 DispatchProxy 实现一个简单Rpc远程调用
前言 netcore 发布以来,一直很关注netcore的进程.目前在公司负责的网站也历经波折的全部有.net framework 4.0 全部切换到netcore 2.2 版本中.虽然过程遇到的坑不 ...
随机推荐
- Zabbix3.0版报警设置
各项报警历史记录查看:“报表--Action log” ------------------------------------------------------------------------ ...
- PHP查询登录中的sql注入
---------------------------------------------------------------------------------------------------- ...
- C++ 原来 const 中所使用的函数 必须 全都具有 const 才行
今天在写程序的时候,出现了一个错误 "对象包含与成员函数不兼容的类型限定符",从网上查了一下,原来原因是这样子的 void showPair();改成 void showPair ...
- Python之路 - Socket实现QQ聊天
Python之路 - Socket实现QQ聊天 介绍
- centos7 增加虚拟网卡
确认内核是否有tun模块 # modinfo tun yum install tunctl -y 如果找不到 vim /etc/yum.repos.d/nux-misc.repo [nux-misc] ...
- mui-当使用addeleventlisener()方法绑定事件时选择器无法绑定事件
在mui中绑定事件不能用jQuery或mui(“#XX”)的形式选取某个元素,而是document.getelementbyid()的形式 mui(“#XX”)可以使用on方法绑定事件
- Spring Boot 邮件配置
######################################################## spring boot mail tls ###################### ...
- 设计table表格,用js设计偶数行和奇数行显示不同的颜色
第一种:鼠标经过时table表格中的颜色根据奇偶行改变不同的颜色 <!DOCTYPE html> <html> <head> <meta charset=&q ...
- 物料没加DUMMY
会加入DUMMY的表 IN_ITEM,IN_ITEM_SITE,IN_SALES_ORDER 加入DUMMY的存储过程名为SAP_MATERIAL_SO. FP_CHANGE_MO_ROUTING的第 ...
- 无线渗透wpa加密路由器
破解wpa加密路由器的原理不同于破解wep加密路由器,只能通过暴力破解获取. 但是获取握手keystream的原理差不多 首先杀死可能会和破解冲突的进程 airmon-ng check kill 开启 ...