C# 创建基于TCP、HTTP协议的JsonRpc 2.0(可跨平台、跨语言)
文章目录
- 一、序言
- 1.1 RRQMSocket.RPC.JsonRpc特点
- 二、程序集源码、Demo下载
- 2.1 源码位置
- 2.2 Demo位置
- 三、安装
- 四、创建JsonRpc服务器
- 4.1 创建服务
- 4.2 创建基于TCP协议的JsonRpc解析器
- 4.3 创建基于HTTP协议的JsonRpc解析器
- 4.4 注册服务、启动RPC服务器
- 五、简单调用
- 5.1 使用“网络调试助手”以TCP协议调用
- 5.2 使用“Postman”以HTTP协议调用
- 六、C#客户端调用
- 七、C#代理客户端调用
- 7.1 获取代理文件
- 7.2 通过代理调用
一、序言
JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 其使用JSON(RFC 4627)作为数据格式,它的调用与语言,平台无关,且可以直接应用于Web等。
1.1 RRQMSocket.RPC.JsonRpc特点
- 高性能、多线程。
- 支持TCP、HTTP协议。
- 支持自定义数据类型与自定义类型嵌套。
- 支持内联调用,可与C#的初始值设定完美配合。
- C#端支持客户端快捷调用和代理调用。
二、程序集源码、Demo下载
2.1 源码位置
- Gitee
- Github
2.2 Demo位置
- RRQMBox Gitee
- RRQMBox Github
三、安装
安装RRQMSocket.RPC.JsonRpc
即可,具体步骤详看链接博客。
VS、Unity安装和使用Nuget包
四、创建JsonRpc服务器
4.1 创建服务
新建类文件,命名为Server,继承自ServerProvider,然后添加一个方法,使用【JsonRpc】标记。
public class Server: ServerProvider
{[JsonRpc]public string TestJsonRpc(string str){return "RRQM";}}
4.2 创建基于TCP协议的JsonRpc解析器
static IRPCParser CreateTcpJsonRpcParser()
{JsonRpcParser jsonRpcParser = new JsonRpcParser();JsonRpcParserConfig config = new JsonRpcParserConfig();config.ProtocolType = JsonRpcProtocolType.Tcp;//使用Tcp协议,调用时,有且仅有调用消息末尾追加“\r\n”。否则会调用失败。config.ListenIPHosts = new RRQMSocket.IPHost[] { new RRQMSocket.IPHost(7705)};config.ProxyToken = "RPC";//生成代理时需要验证jsonRpcParser.Setup(config);jsonRpcParser.Start();Console.WriteLine("TCP协议的JsonRpc已启动");return jsonRpcParser;
}
4.3 创建基于HTTP协议的JsonRpc解析器
static IRPCParser CreateHTTPJsonRpcParser()
{JsonRpcParser jsonRpcParser = new JsonRpcParser();JsonRpcParserConfig config = new JsonRpcParserConfig();config.ProtocolType = JsonRpcProtocolType.Http;//使用Tcp协议,调用时,有且仅有调用消息末尾追加“\r\n”。否则会调用失败。config.ListenIPHosts = new RRQMSocket.IPHost[] { new RRQMSocket.IPHost(7706) };config.ProxyToken = "RPC";//生成代理时需要验证jsonRpcParser.Setup(config);jsonRpcParser.Start();Console.WriteLine("HTTP协议的JsonRpc已启动");return jsonRpcParser;
}
4.4 注册服务、启动RPC服务器
static void Main(string[] args)
{RPCService rpcService = new RPCService();rpcService.AddRPCParser("tcpJsonRpcParser ", CreateTcpJsonRpcParser());rpcService.AddRPCParser("httpJsonRpcParser ", CreateHTTPJsonRpcParser());rpcService.RegisterServer<Server>();//注册服务Console.WriteLine("RPC服务已启动");Console.ReadKey();
}
五、简单调用
服务在启动以后,即可调用。具体的数据格式请参照JSON-RPC 2.0 Specification。
下面将进行简单示例调用。
5.1 使用“网络调试助手”以TCP协议调用
在服务启动后,启动网络调试助手连接,然后按图中配置,使用以下字符串测试调用。
注意: 在输入框中输入调用字符串后,需要按住Shift键+回车键,相当于在输入框中添加“\r\n”字符。
{"jsonrpc":"2.0","method":"TestJsonRpc","params":[5],"id":1}
5.2 使用“Postman”以HTTP协议调用
调用时,可以使用GET、Post。Body类型也无所谓固定。但是Body的内容必须是满足JsonRpc 2.0的数据标准。
{"jsonrpc":"2.0","method":"TestJsonRpc","params":[5],"id":1}
六、C#客户端调用
JsonRpc在C#的语言下,RRQM提供了快捷调用客户端供大家使用。详细过程如下:
【TCP协议调用】
static void TestTcpJsonRpcParser()
{JsonRpcClient jsonRpcClient = new JsonRpcClient();var config = new JsonRpcClientConfig();config.ProtocolType = JsonRpcProtocolType.Tcp;config.RemoteIPHost = new RRQMSocket.IPHost("127.0.0.1:7705");jsonRpcClient.Setup(config);jsonRpcClient.Connect();Console.WriteLine("连接成功");while (true){string result = jsonRpcClient.Invoke<string>("TestJsonRpc", InvokeOption.WaitInvoke, Console.ReadLine());Console.WriteLine($"返回结果:{result}");}
}
【HTTP协议调用】
static void TestHttpJsonRpcParser()
{JsonRpcClient jsonRpcClient = new JsonRpcClient();var config = new JsonRpcClientConfig();config.ProtocolType = JsonRpcProtocolType.Http;config.RemoteIPHost = new RRQMSocket.IPHost("127.0.0.1:7706");jsonRpcClient.Setup(config);jsonRpcClient.Connect();Console.WriteLine("连接成功");while (true){string result = jsonRpcClient.Invoke<string>("TestJsonRpc", InvokeOption.WaitInvoke, Console.ReadLine());Console.WriteLine($"返回结果:{result}");}
}
七、C#代理客户端调用
上述调用,已经基本上可以满足调用了,但是当方法太多,且参数如果不是基础类型时,C#调用会变得异常麻烦。这时候,生成代理文件,然后调用,就变得很重要了。
7.1 获取代理文件
获取代理文件详情
7.2 通过代理调用
此时,代理中会生成Server
类,和TestJsonRpc
的接口方法。
static void TestProxy()
{JsonRpcClient jsonRpcClient = new JsonRpcClient();var config = new JsonRpcClientConfig();config.ProtocolType = JsonRpcProtocolType.Http;config.RemoteIPHost = new RRQMSocket.IPHost("127.0.0.1:7706");jsonRpcClient.Setup(config);jsonRpcClient.Connect();Console.WriteLine("连接成功");RRQMProxy.Server server = new RRQMProxy.Server(jsonRpcClient);//载入连接器while (true){string result = server.TestJsonRpc(Console.ReadLine());Console.WriteLine($"返回结果:{result}");}
}
C# 创建基于TCP、HTTP协议的JsonRpc 2.0(可跨平台、跨语言)相关推荐
- 【网络编程】基于TCP/IP协议的C/S模型
相关视频--C3程序猿-windows网络编程:第一部分tcp/ip 我的小站--半生瓜のblog 基于TCP/IP协议的C/S模型 基于TCP/IP协议的C/S模型 TCP/IP协议 Client/ ...
- 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)
基于Python与TCP协议的私人聊天室(GUI交互界面,用户注册.用户登录.实时聊天,文件上传与下载) 用Python开发的基于TCP通讯协议的实时聊天通讯和文件共享应用 目录 基于Python与T ...
- 基于TCP/IP协议 区别 GET和POST
基于TCP/IP协议讲解GET和POST的区别(转载于博客园) 在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象.但是如果路上跑的全是看起来一模一样的汽 ...
- Linux系统下实现基于TCP/IP协议的简单Socket通信
Linux系统下实现基于TCP/IP协议的简单Socket通信 网络套接字Socket Socket概念 主机字节序和网络字节序 Sockaddr地址结构 Socket实现客户端.服务端通信 服务端程 ...
- 基于TCP/IP协议的网络摄像头的QT项目
目录 项目简述: 1.服务器 步骤一:首先搭建一个基本的服务器框架. 1.初始化服务器的函数主体 2.等待连接 步骤二:数据库的使用,本次项目使用的Sqlite3数据库 1.数据库初始化 2.登录时使 ...
- 打印服务器协议,基于TCP/IP协议的嵌入式网络打印服务器设计
摘要: 随着电子技术和计算机网络技术的发展,嵌入式系统在家庭和工业的各个领域都得到了广泛的应用,各种信息家电,网络设备以及工业控制领域都出现了嵌入式系统的身影,其数量已经远远超过了各种通用计算机.但是 ...
- 基于TCP/IP协议的物联网安卓应用开发基础教程(Android Studio开发)
[华为云IOT物联网论坛外部版主:中华小能能] 第0章 简介 大家好,在上上上期发布的教程中,教大家如何利用Android Studio开发出一款接入华为云物联网平台并调用相关API完成设备属性查询. ...
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...
- 上位机服务器通讯协议,基于TCP/IP协议实现上位机对UR机器人的远程控制
1.引言 2010年,德国学术界和产业界提出"工业4.0"的概念,即是以智能制造为主导的第四次工业革命,或革命性的生产方法.该战略旨在通过充分利用信息通讯技术和网络空间虚拟系统-信 ...
- zynq tcp如何从网口发数据_基于TCP/IP协议的电口通信
之前有介绍过TCP/IP协议的实现是通过轻量级LWIP协议实现的,具体在FPGA中实现又可以分为多种方式,具体如下: 图8‑98 LWIP协议在FPGA中的实现方式 LWIP可以通过硬核实现或者软核实 ...
最新文章
- python split space
- 控制台输入与Math Random的基本使用
- chm转pdf_简历是以PDF还是Word格式提交的?
- java录入会员信息_java-第三章-升级我行我素购物管理系统,实现会员信息录入的功能...
- California Fault Lines: Understanding the Causes and Impact of Network Failures
- JAVA Cannot find class [×××] for bean with name ‘×ב defined in class path resource [×××] 问题解决方法
- java png生成webp图片_PNG转WEBP格式的动态图
- Windows核心编程_窗口蒙版效果
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_05-新增页面-服务端-接口测试...
- jvm参数-verbose:gc和-XX:+PrintGC有区别?
- 7 个有趣的 Python 实战项目,超级适合练手
- linux开发工具少_从设计到开发,我必不可少的10种工具
- #17-【二分】gdgzoi::比赛.Contest2281.Problem D (包裹快递)(zly#1)
- 互联网大佬纷纷搞养殖,这是为哪般~~~
- 用 Go 手写一个 JSON 序列化器
- html5 placeholder与value的区别
- 目标检测(十一)——DSSD
- 今日NFT/数字藏品热点
- java jdk 8学习笔记,Java JDK 8学习笔记 PDF_源雷技术空间
- 【重学计算机网络】DHCP IP的“孽缘“
热门文章
- 通信原理最佳接收-匹配滤波器
- 基于CWMP(TR069)协议ACS服务器的搭建
- 计算机毕业设计JAVA‘大学生心理健康咨询管理系统mybatis+源码+调试部署+系统+数据库+lw
- 每个Linux 用户都应该知道的Linux技巧
- java并发圣经,差距不止一星半点!Github星标85K的性能优化法则圣经
- android rtmp 播放器下载,android rtmp player 除了播放一般的视频格式 - 下载 - 搜珍网...
- html中支持的常用中文字体
- SAP GR/IR在系统AP中收货和校验对会计业务的影响(详细)
- 苹果越狱后怎么还原_iOS 13.3 越狱提升稳定性,自签又可以使用了
- TS入门——01.数据类型