说明
可配置项
属性名 | 属性描述 |
---|---|
SetBufferLength | 缓存池容量,默认1024*10 |
SetMaxPackageSize | 数据包最大值,默认1024102410。该值会在适当时间,直接作用DataHandlingAdapter.MaxPackageSize |
SetRemoteIPHost | 链接到的远程IPHost,支持域名。支持类型: 1. 使用IP&Port,传入形如:127.0.0.1:7789的字符串即可。 1. 使用域名,必须包含协议类型,形如:http://baidu.com或者https://baidu.com:80 |
UseSeparateThreadSend | 在异步发送时,使用独立线程发送,设置为True时,发送流量大大提高,但是及时性会稍降。 |
SetReceiveType | 接收类型。 - AUTO:自动接收模式。 - None:不投递IO接收申请,用户可通过GetStream,获取到流以后,自己处理接收。注意:连接端不会感知主动断开。 |
UsePlugin | 是否启用插件。在启用时或许会带来一点点性能损耗,基本上不是千万数据交互根本不值一提。 |
SetClientSslOption | Ssl配置,为Null时则不启用。 注意,当RemoteIPHost使用https、wss的域名时,该配置会使用系统默认配置生效。 |
SetKeepAliveValue | 为Socket设置的属性。 注意:该配置仅在window平台生效。 |
SetBindIPHost | 绑定端口。 - 在UdpSessionBase中表示本地监听地址 - 在TcpClient中表示固定客户端端口号。 |
SetMaxPackageSize | 数据包最大值,默认1024102410。该值会在适当时间,直接作用于DataHandlingAdapter.MaxPackageSize属性。 |
UseNoDelay | 设置Socket的NoDelay属性,默认false。 |
UseReuseAddress | 启用端口复用。该配置可在服务器、或客户端在监听端口时,运行监听同一个端口。可以一定程度缓解端口来不及释放的问题 |
支持插件接口客户端、服务器均支持
声明自定义实例类,然后实现ITcpPlugin接口,即可实现下列事务的触发。
或者继承自TcpPluginBase类,重写相应方法即可。
ITcpPlugin
OnConnected | 客户端连接成功后触发 |
OnConnecting | 在即将完成连接时触发。 |
OnDisconnected | 会话断开后触发 |
OnReceivedData | 在收到数据时触发 |
OnSendingData | 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 |
OnIDChanged | 当Client的ID被更改后触发 |
创建TcpClient
非泛型创建TcpService时,实际上是使用了默认的SocketClient,此时会将收到的数据从Received事件中直接抛出。创建过程如下:
TcpClient tcpClient = new TcpClient();
tcpClient.Connected += (client, e) => { };//成功连接到服务器
tcpClient.Disconnected += (client, e) => { };//从服务器断开连接,当连接不成功时不会触发。
tcpClient.Received += (client, byteBlock, requestInfo) =>
{
//从服务器收到信息
string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
Console.WriteLine($"接收到信息:{mes}");
};
//声明配置
TouchSocketConfig config = new TouchSocketConfig();
config.SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
.UsePlugin()
.SetBufferLength(1024 * 10);
//载入配置
tcpClient.Setup(config);
tcpClient.Connect();
tcpClient.Send("RRQM");
主要方法简介
方法名 | 功能简介 |
---|---|
Connect | 连接到服务器。 |
Send | 发送数据,该数据会经适配器封装。 |
DefaultSend | 发送数据,该数据会绕过适配器,直接发送。 |
同步发送(Send)
使用
TcpClient已经内置了三种同步发送方法,直接调用就可以发送,但需要注意的是,通过该方法发送的数据,会经过适配器,如果想要直接发送,请使用DefaultSend。如果发送失败,则会立即抛出异常。
public virtual void Send(byte[] buffer);
public virtual void Send(ByteBlock byteBlock);
public virtual void Send(byte[] buffer, int offset, int length);
调用顺序
- TcpClient.Send;
⇓ - DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
⇓ - DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
⇓ -
非独立线程异步发送(SendAsync)
使用
TcpClient已经内置了三种异步发送方法,直接调用就可以发送。如果发送失败,会抛出异常。public virtual void SendAsync(byte[] buffer);
public virtual void SendAsync(ByteBlock byteBlock);
public virtual void SendAsync(byte[] buffer, int offset, int length);
调用顺序
TcpClient.Send;
⇓- DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
⇓ - DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
⇓ - Socket.BeginSend
独立线程异步发送
说明
独立线程异步发送数据顾名思义,就是采用单独的线程完成发送操作,其整体发送效率较高。如果发送失败,会通过 日志输出 , 不会触发异常 。
使用
使用与TcpClient异步发送一致,只需在配置中注入TcpClientConfig.SeparateThreadSendProperty的值为True即可。如果发送失败,会通过 日志输出 , 不会触发异常 。
public virtual void SendAsync(byte[] buffer);
public virtual void SendAsync(ByteBlock byteBlock);
public virtual void SendAsync(byte[] buffer, int offset, int length);
1.2 调用顺序
- TcpClient.Send;
⇓ - DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
⇓ - DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
⇓ - AsyncSender.AsyncSend;(通过AsyncSend把数据压入队列,同时唤醒发送线程)
⇓ - AsyncSender.tryGet;(从队列获取待发送数据,并将小数据压缩至已设置的长度)
⇓ - Socket.SendAsync;(通过Socket IOCP发送数据)
视频介绍
点击查看【bilibili】