---
id: createtouchrpcclient
title: 创建TouchRpc客户端
---

import Tag from "@site/src/components/Tag.js";

## 一、说明

TouchRpc客户端对应的，也有四种不同协议的版本。

## 二、可配置项

<details>
<summary>可配置项</summary>
<div>

#### SetVerifyTimeout
设置验证超时时间，默认3000ms。（仅TcpTouchRpc可用） 。

#### SetVerifyToken
设置验证口令。 

#### SetHeartbeatFrequency
设置心跳。默认为间隔2000ms，连续3次无响应即视为断开。

#### SetSerializationSelector
设置序列化选择器。

#### SetResponseType
设置允许的响应类型

#### SetRootPath
设置根路径

#### SetDefaultId
设置客户端的默认Id

#### SetMetadata
设置连接时的元数据组

</div>
</details>

## 三、支持插件接口

声明自定义实例类，然后实现**ITouchRpcPlugin**接口，即可实现下列事务的触发。
或者继承自**TouchRpcPluginBase**类，重写相应方法即可。

|  插件方法 | 功能 |
| --- | --- |
| OnHandshaking | 客户端在验证连接。默认情况下，框架会首先验证连接Token是否正确，如果不正确则直接拒绝。不会有任何投递。用户也可以使用Metadata进行动态验证。 |
| OnHandshaked | 客户端完成连接验证 |
| OnFileTransfering | 在文件传输即将进行时触发。 |
| OnFileTransfered | 当文件传输结束之后。并不意味着完成传输，请通过e.Result属性值进行判断。 |
| OnLoadingStream | 在远程请求加载流时触发。 |
| OnReceivedProtocolData | 收到协议数据 |
| OnRemoteAccessing | 在远程操作访问之前。 |
| OnRemoteAccessed | 在远程操作访问之后。 |
| OnRouting | 当需要转发路由包时。一般所有的**客户端之间**的数据传输，都需要经过该函数的运行。 |
| OnStreamTransfering | 即将接收流数据，用户需要在此事件中对e.Bucket初始化。 |
| OnStreamTransfered | 流数据处理，用户需要在此事件中对e.Bucket手动释放。 当流数据传输结束之后。并不意味着完成传输，请通过e.Result属性值进行判断。 |


## 四、创建

### 4.1 TcpTouchRpcClient

基本创建如下，支持[创建TcpClient](./createtcpclient.mdx)的所有配置。

```csharp
TcpTouchRpcClient client = new TcpTouchRpcClient();
client.Setup(new TouchSocketConfig()
    .SetRemoteIPHost("127.0.0.1:7789")
    .SetVerifyToken("TouchRpc"));
client.Connect();
```

### 4.2 HttpTouchRpcClient

基本创建如下，支持[创建TcpClient](./createtcpclient.mdx)的所有配置。

```csharp
HttpTouchRpcClient client = new HttpTouchRpcClient();
client.Setup(new TouchSocketConfig()
   .SetRemoteIPHost("127.0.0.1:7789")
   .SetVerifyToken("TouchRpc"));
client.Connect();
```

### 4.3 UdpTouchRpc

基本创建如下，支持@的所有配置。

```csharp
UdpTouchRpc client = new UdpTouchRpc();
client.Setup(new TouchSocketConfig()
    .SetBindIPHost(7794)
    .SetRemoteIPHost("127.0.0.1:7789"));//设置目标地址。
client.Start();
```


### 4.4 WSTouchRpcClient

```csharp
 WSTouchRpcClient client = new WSTouchRpcClient();
     client.Setup(new TouchSocketConfig()
         .SetRemoteIPHost("ws://127.0.0.1:5000/wstouchrpc"));
     client.ConnectAsync();
```


### 4.5 TouchRpcClient工厂 <Tag>Pro</Tag>

TouchRpcClient工厂工作模式是一种，由单个主通讯连接和多个传输通讯连接组成的连接池。默认提供了两种类型的Rpc客户端工厂，分别为`TcpTouchRpcClientFactory`，`HttpTouchRpcClientFactory`。两者工作流程及配置基本相同，下面以`TcpTouchRpcClientFactory`为例。

【创建】
```csharp
var clientFactory = new TcpTouchRpcClientFactory()
{
    MinCount = 5,//最小数量，在主连接器成功建立以后，会检测可用连接是否大于该值，否的话会自动建立。
    MaxCount = 10,//最大数量，当超过该数量的连接后，会等待指定时间，或者永久等待。
    OnGetTransferConfig = () => //配置辅助通信
    {
        return new TouchSocketConfig()
           .SetRemoteIPHost("tcp://127.0.0.1:7789");
    }
};

clientFactory.MainConfig
        .SetRemoteIPHost("tcp://127.0.0.1:7789");//配置主通信

//检测主通信器连接，然后如果没有连接，会自动建立连接
Result result = clientFactory.CheckStatus();
```

:::tip 提示

一般的，主通讯器最好启用心跳插件，而传输通讯器，可以根据自己业务决定。

:::  

【使用】

```csharp {5,10}
var clientFactory = CreateTcpClientFactory();
var client = clientFactory.GetTransferClient();
try
{
    //client.Invoke();//这里可以让得到的通讯器进行业务交流
}
finally
{
    //重中之重，必须要释放通讯器
    clientFactory.ReleaseTransferClient(client);
}
```

:::tip 提示

TouchRpcClient工厂只实现了IRpcClient和多线程文件传输的接口，所以和其他客户端相比，本身不具备其他的功能。但是可以通过单个通讯器进行其他业务的交互。

:::  