C# 创建基于TCP、HTTP协议的JsonRpc 2.0(可跨平台、跨语言)


一、序言

JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 其使用JSON(RFC 4627)作为数据格式,它的调用与语言,平台无关,且可以直接应用于Web等。

1.1 RRQMSocket.RPC.JsonRpc特点
  • 高性能、多线程。
  • 支持TCP、HTTP协议。
  • 支持自定义数据类型与自定义类型嵌套。
  • 支持内联调用,可与C#的初始值设定完美配合。
  • C#端支持客户端快捷调用和代理调用。

二、程序集源码、Demo下载

2.1 源码位置
2.2 Demo位置

三、安装

安装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}");
    }
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若汝棋茗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值