go标准库的学习-net/rpc/jsonrpc
参考:https://studygolang.com/pkgdoc
导入方式:
import "net/rpc/jsonrpc"
jsonrpc包实现了JSON-RPC的ClientCodec和ServerCodec接口,可用于rpc包。
func Dial
func Dial(network, address string) (*rpc.Client, error)
Dial在指定的网络和地址连接一个JSON-RPC服务端
func ServeConn
func ServeConn(conn io.ReadWriteCloser)
ServeConn在单个连接上执行DefaultServer。ServeConn会阻塞,服务该连接直到客户端挂起。调用者一般应另开线程调用本函数:"go serveConn(conn)"。ServeConn在该连接使用JSON编解码格式。
举例:
JSON RPC
服务端:
package main import (
"fmt"
"net"
"net/rpc"
"net/rpc/jsonrpc"
"errors"
"os"
) type Args struct{
A, B int
} type Quotient struct{
Quo, Rem int
} type Arith int func (t *Arith) Multiply(args *Args, reply *int) error{
*reply = args.A * args.B
return nil
} func (t *Arith) Divide(args *Args, quo *Quotient) error{
if args.B == 0{
return errors.New("divide by zero")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
} func main() {
arith := new(Arith)
rpc.Register(arith) tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")//jsonrpc是基于TCP协议的,现在他还不支持http协议
if err != nil{
fmt.Println(err.Error())
os.Exit(1)
} listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil{
fmt.Println(err.Error())
os.Exit(1)
}
for{
conn, err := listener.Accept()
if err != nil{
continue
}
jsonrpc.ServeConn(conn)
}
}
客户端:
package main import (
"fmt"
"net/rpc/jsonrpc"
"log"
"os"
)
type Args struct{
A, B int
} type Quotient struct{
Quo, Rem int
} func main() {
if len(os.Args) != 2{
fmt.Println("Usage: ", os.Args[0], "server:port")
os.Exit(1)
}
service := os.Args[1] client, err := jsonrpc.Dial("tcp", service)
if err != nil{
log.Fatal("dialing : ", err)
} //Synchronous call
args := Args{17, 8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil{
log.Fatal("arith error : ", err)
}
fmt.Printf("Arith: %d*%d = %d \n", args.A, args.B, reply) var quot Quotient
err = client.Call("Arith.Divide", args, ")
if err != nil{
log.Fatal("arith error : ", err)
}
fmt.Printf("Arith: %d/%d = %d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)
}
客户端返回:
userdeMBP:go-learning user$ go run test.go 127.0.0.1:1234
Arith: 17*8 = 136
Arith: 17/8 = 2 remainder
func NewClient
func NewClient(conn io.ReadWriteCloser) *rpc.Client
NewClient返回一个新的rpc.Client,以管理对连接另一端的服务的请求。
func NewClientCodec
func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
NewClientCodec返回一个在连接上使用JSON-RPC的rpc.ClientCodec。
func NewServerCodec
func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
NewServerCodec返回一个在连接上使用JSON-RPC的rpc. ServerCodec。
go标准库的学习-net/rpc/jsonrpc的更多相关文章
- go标准库的学习-net/rpc
参考:https://studygolang.com/pkgdoc 导入方法: import "net/rpc" RPC(Remote Procedure Call Protoco ...
- go标准库的学习-net/http
参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...
- go标准库的学习-database/sql
参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...
- go标准库的学习-crypto/md5
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...
- go标准库的学习-crypto/sha1
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...
- go标准库的学习-crypto/sha256
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...
- python 标准库基础学习之开发工具部分1学习
#2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...
- python calendar标准库基础学习
# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...
- golang标准库分析之net/rpc
net/rpc是golang提供的一个实现rpc的标准库.
随机推荐
- Gulp Error: Cannot find module 'jshint/src/cli'
I'm following sitepoint's An introduction to Gulp.js, but I'm stuck on step four, when I try to run ...
- 用JDOM解析XML文件时如何解决中文问题?如何解析?
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import ja ...
- c# DataSet转换为Json
/// <summary> /// DataSet转换为Json /// </summary> /// <param name="dataSet"&g ...
- SpringBoot与Cloud版本匹配问题
在使用SpringCloud的时候需要在SpringBoot工程的pom.xml中引入 <dependencyManagement> <dependencies> <de ...
- 海西 · 云交付 DevOps实践落地方案
一.背景概述 (一)产品背景 1.互联网+的需要 在信息越来越繁杂的互联网时代,公司所运行的项目越来越多,项目相关服务繁多,服务之间存在复杂的依赖关系,运维与管理任务越来越繁重,手工交付需要花 ...
- 配置Tree Shaking来减少JavaScript的打包体积
译者按: 用Tree Shaking技术来减少JavaScript的Payload大小 原文: Reduce JavaScript Payloads with Tree Shaking 译者: Fun ...
- 2018-01-04 浅尝The Little Prover一书, 重逢Chez Scheme
书开篇之前说, 本书的目标的一个例子: 证明(reverse (reverse x))对于任何列表x, 结果总是x. (安装Chez Scheme的200字请看最后) 书刚开始, 就用到一个schem ...
- 【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用
在Android手机上, 在某个程序里,通过按Menu键,一般都会打开这个程序的设置,而在iOS里,系统提供了一个很好的保存程序设置的机制.就是使用Settings Bundle. 在按了HOME键的 ...
- Salesforce自定义权限简介
自定义权限(Custom Permission) Salesforce默认提供了多种方式设定用户的权限,比如简档.权限集等.在这些设定中,已经包括了系统中的对象.应用.字段.页面布局等组件,管理员或开 ...
- JavaScript大杂烩14 - 使用JQuery(上)
JQuery意义 - Why? 为什么要使用JQuery,从我个人来说,就是这么几点:简化代码 + 统一行为 + 功能强大 + 搭配方便. 简化代码是从写代码的角度来说的,实现同样的功能,如果用Jav ...