同步请求
定义
命名空间:TouchSocket.Sockets
程序集:TouchSocket.dll
一、说明
有很多小伙伴一直有一些需求:
- 客户端发送一个数据,然后等待服务器回应。
- 服务器向客户端发送一个数据,然后等待客户端回应。
那针对这些需求,可以使用WaitingClient。其内部实现了IWaitSender接口,能够在发送完成后,等待返回。
二、创建及使用
2.1 以TcpClient为例
var client = new TcpClient();
client.Connect("tcp://127.0.0.1:7789");
//调用CreateWaitingClient获取到IWaitingClient的对象。
var waitClient = client.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
{
return true;
//if (response.Data.Length == 1)
//{
// return true;
//}
//return false;
}
});
//然后使用SendThenReturn。
byte[] returnData = waitClient.SendThenReturn(Encoding.UTF8.GetBytes("RRQM"));
m_tcpClient.Logger.Info($"收到回应消息:{Encoding.UTF8.GetString(returnData)}");
//同时,如果适配器收到数据后,返回的并不是字节,而是IRequestInfo对象时,可以使用SendThenResponse.
ResponsedData responsedData = waitClient.SendThenResponse(Encoding.UTF8.GetBytes("RRQM"));
IRequestInfo requestInfo = responsedData.RequestInfo;//同步收到的RequestInfo
2.2 以TcpService为例
var service = new TcpService();
service.Received = async (client, e) =>
{
//调用CreateWaitingClient获取到IWaitingClient的对象。
var waitClient = client.CreateWaitingClient(new WaitingOptions()
{
FilterFunc =response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
{
return true;
//if (response.Data.Length == 1)
//{
// return true;
//}
//return false;
}
});
//然后使用SendThenReturn。
byte[] returnData =await waitClient.SendThenReturnAsync(Encoding.UTF8.GetBytes("RRQM"));
client.Logger.Info($"收到回应消息:{Encoding.UTF8.GetString(returnData)}");
//同时,如果适配器收到数据后,返回的并不是字节,而是IRequestInfo对象时,可以使用SendThenResponse.
ResponsedData responsedData = waitClient.SendThenResponse(Encoding.UTF8.GetBytes("RRQM"));
IRequestInfo responseRequestInfo = responsedData.RequestInfo;//同步收到的RequestInfo
};
service.Setup(new TouchSocketConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost("tcp://127.0.0.1:7789"), new IPHost(7790) })//同时监听两个地址
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
a.AddConsoleLogger();//添加一个控制台日志注入(注意:在maui中控制台日志不可用)
})
.ConfigurePlugins(a =>
{
//a.Add();//此处可以添加插件
}));
service.Start();//启动
提示
在SendThenReturn时,通过其他参数,还可以设置Timeout,以及可取消的等待Token。
注意事项
- 发送完数据,在等待时,如果收到其他返回数据,则可能得到错误结果。
- 发送采用同步锁,一个事务没结束,另一个请求也发不出去。
- 在Net461及以下版本 中,SendThenReturn与SendThenReturnAsync不能混合使用。即:要么全同步,要么全异步。