---
id: calljsonrpc
title: 发现、调用服务
---


## 一、直接调用

因为JsonRpc是通用调用协议，所以可以直接使用Json字符串调用。

以下字符串只是示例，具体的method参数，应当遵循当前路由。

【Tcp协议直接调用】
在TCP协议时，按照适配器，选择性的是否以\r\n结尾。

```csharp
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
```

【Http协议直接调用】
在Http协议时，以Url+Post方式即可

```csharp
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
```

【Websocket协议直接调用】
在Websocket协议时，以文本类型，直接发送到服务器即可。

```csharp
{"jsonrpc": "2.0", "method": "testjsonrpc", "params":["RRQM"], "id": 1}
```

<a name="aDbqe"></a>

## 二、客户端直接调用

TouchSocket提供了JsonRpc的专属客户端，直接调用，则会则是不使用**任何代理**，直接Call RPC，使用比较简单。

【TCP协议】

```csharp
JsonRpcClient jsonRpcClient = new JsonRpcClient();
jsonRpcClient.Setup(new TouchSocketConfig()
    .SetRemoteIPHost("127.0.0.1:7705")
    .SetJRPT(JRPT.Tcp));
jsonRpcClient.Connect();

Console.WriteLine("连接成功");
string result = jsonRpcClient.Invoke<string>("jsonrpcconsoleapp.server.testjsonrpc", InvokeOption.WaitInvoke, "TouchSocket");
Console.WriteLine($"Tcp返回结果:{result}");

result = jsonRpcClient.Invoke<string>("TestJsonRpc1", InvokeOption.WaitInvoke, "TouchSocket");
Console.WriteLine($"Tcp返回结果:{result}");

result = jsonRpcClient.Invoke<string>("jsonrpcconsoleapp.server.testgetcontext", InvokeOption.WaitInvoke, "TouchSocket");
Console.WriteLine($"Tcp返回结果:{result}");

JObject obj = new JObject();
obj.Add("A", "A");
obj.Add("B", 10);
obj.Add("C", 100.1);
JObject newObj = jsonRpcClient.Invoke<JObject>("jsonrpcconsoleapp.server.testjobject", InvokeOption.WaitInvoke, obj);
Console.WriteLine($"Tcp返回结果:{newObj}");
```

【Http协议】

```csharp
static void JsonRpcClientInvokeByHttp()
{
    JsonRpcClient jsonRpcClient = new JsonRpcClient();
    jsonRpcClient.Setup(new TouchSocketConfig()
        .SetRemoteIPHost("http://127.0.0.1:7706/jsonrpc")
        .SetJRPT(JRPT.Http));
    jsonRpcClient.Connect();
    Console.WriteLine("连接成功");
    string result = jsonRpcClient.Invoke<string>("server/testjsonrpc", InvokeOption.WaitInvoke, "TouchSocket");
    Console.WriteLine($"Http返回结果:{result}");

    JObject obj = new JObject();
    obj.Add("A", "A");
    obj.Add("B", 10);
    obj.Add("C", 100.1);
    JObject newObj = jsonRpcClient.Invoke<JObject>("server/testjobject", InvokeOption.WaitInvoke, obj);
    Console.WriteLine($"Http返回结果:{newObj}");
}
```

【Websocket协议】

```csharp
JsonRpcClient jsonRpcClient = new JsonRpcClient();
jsonRpcClient.Setup(new TouchSocketConfig()
    .SetRemoteIPHost("ws://127.0.0.1:7706/ws")//此url就是能连接到websocket的路径。
    .SetDataHandlingAdapter(() => new TerminatorPackageAdapter("\r\n"))
    .SetJRPT(JRPT.Websocket));
jsonRpcClient.Connect();

Console.WriteLine("连接成功");
string result = jsonRpcClient.TestJsonRpc("RRQM");
Console.WriteLine($"Websocket返回结果:{result}");

result = jsonRpcClient.TestJsonRpc1("RRQM");
Console.WriteLine($"Websocket返回结果:{result}");

result = jsonRpcClient.TestGetContext("RRQM");
Console.WriteLine($"Websocket返回结果:{result}");

JObject obj = new JObject();
obj.Add("A", "A");
obj.Add("B", 10);
obj.Add("C", 100.1);
JObject newObj = jsonRpcClient.TestJObject(obj);
Console.WriteLine($"Websocket返回结果:{newObj}");
```

<a name="rrWhi"></a>

## 代理调用RPC

代理调用的便捷在于，不用再纠结调用的参数类型正不正确，因为这些，代理工具都会替你做好。 <a name="AbsXl"></a>

### 如何生成获取代理文件？

[获取代理文件详情](https://www.yuque.com/eo2w71/rrqm/a13509bfc3581f4576861b690b4a809a) <a name="jsQUz"></a>

### 调用

当代理被客户端获取以后，客户端项目中会多出一个**RRQMProxy（//TODO:这里需要修改，上面的获取代理文件详情的链接失效需要修改，下面截图需要修改）**的文件（或者如果是服务器生成的本地代理，则需要复制到客户端项目中），在该文件中，则包含了所有的**代理方法**和**代理类**，可直接由代理类发起调用。


```csharp
JsonRpcClient jsonRpcClient = new JsonRpcClient(JRPT.Http);
jsonRpcClient.Setup("http://127.0.0.1:7706/jsonrpc");
jsonRpcClient.Connect();
Server server= new Server(jsonRpcClient);//Server是生成的代理类。
server.TestJsonRpc("TouchSocket");//代理调用
```
