当前位置: 首页 > article >正文

【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)

说在前面

  • 操作系统:win11 wsl2
  • go-ethereum版本:1.15.8

关于json-rpc

  • 官网

server

  • 定义方法
    type CalculatorService struct{}func (s *CalculatorService) Add(a, b int) int {return a + b
    }func (s *CalculatorService) Div(a, b int) (int, error) {if b == 0 {return 0, errors.New("divide by zero")}return a / b, nil
    }
    
    这里我们简单定义两个方法
  • 启动服务
    func main() {calculator := new(CalculatorService)// 创建 RPC 服务器rpcServer := rpc.NewServer()// 注册服务if err := rpcServer.RegisterName("calculator", calculator); err != nil {panic(err)}// 启动 HTTP 服务器println("WebSocket server listening on :8080")httpHandler := rpcServer.WebsocketHandler([]string{"*"})http.Handle("/ws", httpHandler)http.ListenAndServe(":8080", nil)
    }
    

client

  • 调用
    在调用的时候,方法名需要指定为receiver_method,例如我们要调用CalculatorService.Add,那么调用名为calculator_add,注意,这里的calculator为server端注册时的RegisterName("calculator", calculator),而不是CalculatorService
    func main() {// 连接 WebSocket 服务端client, err := rpc.DialWebsocket(context.Background(), "ws://192.168.1.6:8080/ws", "")if err != nil {panic(err)}defer client.Close()// 调用远程方法var result interr = client.Call(&result, "calculator_add", 3, 5)if err != nil {panic(err)}fmt.Println("Result:", result) // 输出: Result: 8
    }
    
    假设将server端的RegisterName("calculator", calculator)改为RegisterName("calculate", calculator)
    panic: the method calculator_add does not exist/is not available
    

注意事项

返回值

  • server端的方法返回值只能有三种数量0,1,2
    • 0,即无返回值
    • 1,即自定义返回值或者一个error
    • 2,即自定义返回值+一个error
  • 这样,在client端调用的时候,err = client.Call(&result, "calculator_add", 3, 5)result对应自定义返回值,err对应返回的error
  • 例如,我们调用
    err = client.Call(&result, "calculate_div", 3, 0)
    if err != nil {panic(err)
    }
    
    得到的err即为server端Div方法返回的error
    panic: divide by zero
    

server端调用client端

  • 支持反向调用
  • 在我们定义server端方法的时候,可以增加一个context参数
    type CalculatorService struct{}func (s *CalculatorService) Add(ctx context.Context, a, b int) int {return a + b
    }func (s *CalculatorService) Div(ctx context.Context, a, b int) (int, error) {if b == 0 {return 0, errors.New("divide by zero")}return a / b, nil
    }
    
  • 这样我们就可以获取到client,进而调用其方法,例如,我们在client端添加一个方法
    type CalcService struct{}func (s *CalcService) GetParam(ctx context.Context) int {return 88
    }
    
    然后在client端注册
    func main() {// 连接 WebSocket 服务端client, err := rpc.DialWebsocket(context.Background(), "ws://192.168.1.6:8080/ws", "")if err != nil {panic(err)}defer client.Close()calculator := new(CalcService)client.RegisterName("calc", calculator)// 调用远程方法var result interr = client.Call(&result, "calculate_add", 3, 0)if err != nil {panic(err)}fmt.Println("Result:", result) // 输出: Result: 8
    }
    
    在server端的Add方法中,我们将b的值改为从client端获取
    func (s *CalcService) Add(ctx context.Context, a, b int) int {client, ok := rpc.ClientFromContext(ctx)if ok {client.Call(&b, "calc_getParam")}return a + b
    }
    
    这样运行后的结果为:
    Result: 91
    
  • 通过这种方式,我们可以在server端添加一个Register的方法,在client连接后,client主动调用Register方法,这样我们就可以管理所有client了

相关文章:

【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)

说在前面 操作系统:win11 wsl2go-ethereum版本:1.15.8 关于json-rpc 官网 server 定义方法type CalculatorService struct{}func (s *CalculatorService) Add(a, b int) int {return a b }func (s *CalculatorService) Div(a, b int) (int, error) {…...

逻辑回归 (Logistic Regression)

文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)&#xff08…...

燕山大学计算机网络之Java实现TCP数据包结构设计与收发

觉得博主写的好,给博主点点免费的关注吧! 目录 摘要.................................................................................................................... 4 前言.............................................................…...

如何使用SpringApplicationRunListener在Spring Boot 应用的不同生命周期阶段插入自定义逻辑

目录 一、引言二、核心方法概述三、加载机制四、使用场景五、扩展 - 如何在测试的不同阶段插入逻辑5.1 TestExecutionListener & AbstractTestExecutionListener5.1.1 主要功能5.1.2 生命周期方法 5.2 如何集成TestExecutionListener5.3 总结 一、引言 SpringApplicationR…...

P10413 [蓝桥杯 2023 国 A] 圆上的连线

题意: 给定一个圆,圆上有 n2023 个点从 1 到 n 依次编号。 问有多少种不同的连线方式,使得完全没有连线相交。当两个方案连线的数量不同或任何一个点连接的点在另一个方案中编号不同时,两个方案视为不同。 答案可能很大&#x…...

JavaEE——线程安全

目录 前言1.线程安全的定义2.线程安全问题产生的原因2.1 多个线程修改一个变量2.2 修改操作不是原子的2.3 内存可见性引起的线程安全问题 3.解决线程安全问题的方法3.1 通过synchronized关键字加锁3.2 使用volatile关键字 总结 前言 在使用多线程的时候,难免会出现…...

Redis Hash 介绍

Redis Hash 介绍 从基础命令、内部编码和使用场景三个维度分析如下: 一、基础命令 Redis Hash 提供了丰富的操作命令,适用于字段(field)级别的增删改查: 设置与修改 HSET:设置单个字段值(HSET…...

[redis进阶一]redis的持久化(2)AOF篇章

目录 一 为什么有了RDB持久化机制还要有AOF呢 板书介绍具体原因: ​编辑二 详细讲解AOF机制 (1)AOF的基本使用 1)板书如下 2)开启AOF机制: 3) AOF工作流程 (2)AOF是否会影响到redis性能 ​编辑 (3)AOF缓冲区刷新策略 (4)AOF的重写机制 板书如下: 为什么要有这个重写机…...

【Linux我做主】探秘gcc/g++和动静态库

TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中,编译器如同匠人的工具,将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言,gcc和g是构建C/C程序的核心工具链,掌握它们的原理和使…...

Linux `init 0` 相关命令的完整使用指南

Linux init 0 相关命令的完整使用指南—目录 一、init 系统简介二、init 0 的含义与作用三、不同 Init 系统下的 init 0 行为1. SysVinit(如 CentOS 6、Debian 7)2. systemd(如 CentOS 7、Ubuntu 16.04)3. Upstart(如 …...

【英语语法】基本句型

目录 前言一:主谓二:主谓宾三:主系表四:主谓双宾五:主谓宾补 前言 英语基本句型是语法体系的基石,以下是英语五大基本句型。 一:主谓 结构:主语 不及物动词 例句: T…...

Vue3中发送请求时,如何解决重复请求发送问题?

文章目录 前言一、问题演示二、使用步骤1.One组件2.Two组件封装工具函数处理请求 总结 前言 在开发过程中,重复请求发送问题可能会导致数据不一致、服务器压力增加或用户操作异常。以下是解决重复请求问题的常见方法和最佳实践: 一、问题演示 我们看着…...

信息学奥赛一本通 1622:Goldbach’s Conjecture | 洛谷 UVA543 Goldbach‘s Conjecture

【题目链接】 ybt 1622:Goldbach’s Conjecture 洛谷 UVA543 Goldbach’s Conjecture 【题目考点】 1. 筛法求质数表 埃筛线性筛(欧拉筛) 知识点讲解见信息学奥赛一本通 2040:【例5.7】筛选法找质数 【解题思路】 首先使用埃…...

在极狐GitLab 身份验证中如何使用 OIDC?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 使用 OpenID Connect 作为认证提供者 (BASIC SELF) 您可以使用极狐GitLab 作为客户端应用程序,与 OpenID Connec…...

计算机视觉与深度学习 | 基于YOLOv8与光流法的目标检测与跟踪(Python代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 目标检测与跟踪 关键实现逻辑检测-跟踪协作机制‌特征点选择策略‌运动…...

解决 VSCode 中 NVM 配置后无法识别 Node 和 NPM 的问题

在开发中,我们经常需要使用 Node.js 和 NPM 来管理 JavaScript 项目依赖,而 NVM(Node Version Manager)是开发者在本地环境中管理多个 Node.js 版本的得力工具。不过,有时候在 VSCode 中配置完 NVM 后,可能…...

观察者模式:从博客订阅到消息队列的解耦实践

观察者模式:从博客订阅到消息队列的解耦实践 一、模式核心:用事件驱动实现对象间松耦合 在新闻 APP 中,当热点事件发生时需要实时通知所有订阅用户;在电商系统中,库存变化需触发价格监控模块重新计算。这类场景的核心…...

ReportLab 导出 PDF(页面布局)

ReportLab 导出 PDF(文档创建) ReportLab 导出 PDF(页面布局) ReportLab 导出 PDF(图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…...

qt与html通信

**Cef视图(CefView)**是指在使用Chromium Embedded Framework(CEF)时,嵌入到应用程序中的浏览器视图。CEF是一个开源项目,它基于Google的Chromium浏览器,允许开发者将Web浏览器功能嵌入到自己的…...

git 根据http url设置账号密码

1. 原因 场景:有一种情况,比如在github上面有多个账号,并且每个账号都有些仓库的内容需要修改,并且这些账号自己,不是协作者的关系。这个时候需要针对每个仓库的url设置用户名密码, 2. 设置 2.1 第一步:…...

【CVE-2024-10929】ARM CPU漏洞安全通告

安全之安全(security)博客目录导读 目录 一、概述 二、CVE详情 三、受影响产品 四、建议措施 五、致谢 六、版本历史 一、概述 在部分基于Arm架构的CPU中发现了一个潜在安全问题,称为Spectre-BSE(Branch Status Eviction,分支状态驱逐…...

OpenCV 图形API(33)图像滤波-----高斯模糊函数gaussianBlur()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用高斯滤波器对图像进行模糊处理。 该函数使用指定的高斯核对源图像进行滤波。输出图像必须与输入图像具有相同的类型和通道数。 cv::gapi::g…...

【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)

如何将 APK 内置为系统应用(适用于编辑设置属性) 在 Android 中,将 APK 文件内置为系统应用涉及到一系列的命令和步骤。以下是详细的操作流程,帮助您解决常见问题,如 /system not in /proc/mounts 的错误。 挂载system/app获取可读写权限 …...

【2025最新版】火鸟门户v8.5系统源码+PC、H5、小程序 +数据化大屏插件

一.介绍 火鸟地方门户系统V8.5源码 系统包含4端: PCH5小程序APP 二.搭建环境 系统环境:CentOS、 运行环境:宝塔 Linux 网站环境:Nginx 1.2.22 MySQL 5.6 PHP-7.4 常见插件:fileinfo ; redis 三.测…...

关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念

以下是关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念: 一、传感器的定义与核心功能 1. 定义 传感器(Sensor)是一种能够将物理量&#xff…...

EtherCAT转ProfiNet边缘计算网关配置优化:汽车制造场景下PLC与机器人协同作业案例

1.行业背景与需求分析 智能汽车焊装车间是汽车制造的核心工艺环节,某德国豪华品牌在其上海MEB工厂新建的焊装车间中,采用西门子S7-1500PLC作为ProfiNet主站,负责整线协调与质量追溯;同时部署KUKAKR1500Titan机器人(Eth…...

极狐GitLab CI/CD 流水线计算分钟数如何管理?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 计算分钟管理 (PREMIUM SELF) 在极狐GitLab 16.1 中,从 CI/CD 分钟数重命名为计算配额或计算分钟数。 管理员可…...

HTTP协议 --- 超文本传输协议 和 TCP --- 传输控制协议

是基于 TCP 协议的 80 端口的一种 C/S 架构协议。 特点:无状态 --- 数据传输完成后,会断开 TCP 连接,哪怕浏览器还正常运行。 请求报文 --- 方法 响应报文 --- 状态码 是一种面向连接的可靠传输协议 。 面向连接 --- 在传输数据之前&am…...

类和对象(下篇)(详解)

【本节目标】 1. 再谈构造函数 2. Static成员 3. 友元 4. 内部类 5. 再次理解封装 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 #include <iostream> using name…...

Uniapp:获取当前定位坐标

目录 一、出现场景二、具体使用 一、出现场景 在项目的开发中&#xff0c;会出现打卡、定位当前位置的功能&#xff0c;那我们如何获取当前位置呢&#xff1f;这就需要使用getLocation来获取当前位置坐标 二、具体使用 uni.getLocation({type: wgs84, // 返回可以用于uni.op…...