1、jsonrpc包

该实现了JSON-RPC的ClientCodec和ServerCodec接口,可用于rpc包。

可用于跨语言使用go rpc服务。

2、常用方法

(1)func Dial(network, address string) (*rpc.Client, error)

Dial在指定的网络和地址连接一个JSON-RPC服务端。

(2)func NewClient(conn io.ReadWriteCloser) *rpc.Client

NewClient返回一个新的rpc.Client,以管理对连接另一端的服务的请求。

(3)func NewClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec

NewClientCodec返回一个在连接上使用JSON-RPC的rpc.ClientCodec。

(4)func NewServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec

NewServerCodec返回一个在连接上使用JSON-RPC的rpc. ServerCodec。

(5)func ServeConn(conn io.ReadWriteCloser)

ServeConn在单个连接上执行DefaultServer。

ServeConn会阻塞,服务该连接直到客户端挂起。

调用者一般应另开线程调用本函数:"go serveConn(conn)"。

ServeConn在该连接使用JSON编解码格式。

3、代码示例

package main

import (
"errors"
"fmt"
"log"
"net"
"net/rpc"
"net/rpc/jsonrpc"
) // Args 参数
type Args struct {
A, B int
} // Quotient 商、余数
type Quotient struct {
Quo, Rem int
} // Arith 算术服务
type Arith int // Multiply 乘法服务
func (*Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
} // Divide 除法服务
func (*Arith) Divide(args *Args, quo *Quotient) error {
if args.B == 0 {
return errors.New("除数不能为零")
}
quo.Quo = args.A / args.B
quo.Rem = args.A % args.B
return nil
} // 错误检查
func checkErr(err error) {
if err != nil {
log.Fatalln(err)
}
}
func main() {
//注册服务
err := rpc.Register(new(Arith))
checkErr(err)
//设置监听
lis, err := net.Listen("tcp", "127.0.0.1:1234")
checkErr(err)
//服务端等待请求
go func(lis net.Listener) {
for {
conn, err := lis.Accept()
if err != nil {
continue
}
// 并发处理客户端请求
go func(conn net.Conn) {
jsonrpc.ServeConn(conn)
}(conn)
}
}(lis)
//客户端请求服务
client, err := jsonrpc.Dial("tcp", ":1234")
checkErr(err)
defer client.Close()
//乘法
args := &Args{A: 17, B: 3}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
checkErr(err)
fmt.Printf("Arith.Multiply:%d * %d = %d\n", args.A, args.B, reply)
//除法
quotient := new(Quotient)
call := client.Go("Arith.Divide", args, quotient, nil)
<-call.Done
fmt.Printf("Arith.Divide:%d / %d = %d .... %d\n", args.A, args.B, quotient.Quo, quotient.Rem)
} //输出
// Arith.Multiply:17 * 3 = 51
// Arith.Divide:17 / 3 = 5 .... 2

golang——net/rpc/jsonrpc包学习的更多相关文章

  1. go标准库的学习-net/rpc/jsonrpc

    参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...

  2. 一个入门rpc框架的学习

    一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...

  3. github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调

    github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...

  4. Go 的 golang.org/x/ 系列包和标准库包有什么区别?

    在开发过程中可能会遇到这样的情况,有一些包是引入自不同地方的,比如: golang.org/x/net/html 和 net/html, golang.org/x/crypto 和 crypto. 那 ...

  5. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  6. R语言爬虫初尝试-基于RVEST包学习

    注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...

  7. golang格式化输出-fmt包用法详解

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...

  8. golang——net/rpc包学习

    1.rpc包 rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问. 只有满足如下标准的方法才能用于远程访问,其余方法会被忽略: (1)方法是导出的(2)方法有两个参数,都是导出类型或内建 ...

  9. golang net包学习笔记

    阅读源代码发现在net包中主要实现了ip.tcp.udp.unix等通信方式.它们大致可以分成两大类:其一,ip.udp.unix(DGRAM),这是一些无链接的协议,其二,tcp.unix(STRE ...

随机推荐

  1. Codeforces Round #531 (Div. 3) E. Monotonic Renumeration (构造)

    题意:给出一个长度为\(n\)的序列\(a\),根据\(a\)构造一个序列\(b\),要求: ​ 1.\(b_{1}=0\) ​ 2.对于\(i,j(i\le i,j \le n)\),若\(a_{i ...

  2. 使用Github+jsDelivr搭建图床和存储服务

    使用元素 我的博客NLNet 并未搭建自己的博客,使用博客园(cnblogs),自定义了主题NLNet-Theme. 写作工具Typora 优秀的Markdown编辑器.参考NLNet-Theme,我 ...

  3. Linux core dump使用

    什么是 core dump? core dump是一个当进程意外终止时包含进程内存内容的文件.当程序崩溃的时候,core dump由kernel触发.core dump可以作为程序崩溃时的事后快照(p ...

  4. 001、Python数据结构

    #! usr/bin/env python # _*_ coding:utf-8 _*_ from random import randint ''' 一.list的增删改查 1.list.appen ...

  5. Win7下安装IIS

    安装IIS 1.控制面板 --> 程序 --> 卸载程序,进入"程序与功能". 2.进入"打开或关闭Window功能". 3.找到"Int ...

  6. codeforces 758D

    D. Ability To Convert time limit per test 1 second memory limit per test 256 megabytes input standar ...

  7. Spring-cloud-netflix-hystrix

    服务注册中心eureka-server已经搭好,并且SPRING-CLOUD-NETFLIX-EUREKA-CLIENT-APPLICATION提供一个hello服务 畏怯还编写一个eureka-cl ...

  8. Apple Watch Series 6 无法使用截屏问题和解决方案

    Apple Watch Series 6 无法使用截屏问题和解决方案 shit Apple,无法使用截屏, TMD 根本就不存在 相机胶卷 ! 不好使 解决方案 ??? https://support ...

  9. js 深入原理讲解系列-Promise

    js 深入原理讲解系列-Promise 能看懂这一题你就掌握了 js Promise 的核心原理 不要专业的术语,说人话,讲明白! Q: 输出下面 console.log 的正确的顺序? const ...

  10. ES6 进制字面量 All In One

    ES6 进制字面量 All In One 二进制 & 八进制 & 字面量 https://developer.mozilla.org/en-US/docs/Web/JavaScript ...