跳到主要内容
版本:1.3.9

Udp同步请求

一、说明

有很多小伙伴对于Udp一直有一些需求:

  1. 客户端发送一个数据,然后等待服务器回应。
  2. 服务器向客户端发送一个数据,然后等待客户端回应。

那针对这些需求,可以使用WaitingClient。其内部实现了IWaitSender接口,能够在发送完成后,等待返回。

二、创建及使用

2.1 以UdpSession为例

UdpSession udpSession = new UdpSession();
var config = new TouchSocketConfig()
.SetBindIPHost(new IPHost(0))//必要设置
.SetRemoteIPHost(new IPHost("127.0.0.1:7789"));//可以不设置

//载入配置
udpSession.Setup(config);
udpSession.Start();

//调用GetWaitingClient获取到IWaitingClient的对象。
var waitClient = udpSession.GetWaitingClient(new WaitingOptions()
{
AdapterFilter = AdapterFilter.AllAdapter,//表示发送和接收的数据都会经过适配器
RemoteIPHost = new IPHost("127.0.0.1:7799")//表示目的地址
});

//然后使用SendThenReturn。
byte[] returnData = waitClient.SendThenReturn(Encoding.UTF8.GetBytes("RRQM"));
udpSession.Logger.Info($"收到回应消息:{Encoding.UTF8.GetString(returnData)}");

//同时,如果适配器收到数据后,返回的并不是字节,而是IRequestInfo对象时,可以使用SendThenResponse.
ResponsedData responsedData = waitClient.SendThenResponse(Encoding.UTF8.GetBytes("RRQM"));
IRequestInfo requestInfo = responsedData.RequestInfo;//同步收到的RequestInfo
注意

Udp的同步请求,有两种策略,一种则是在配置中设置SetRemoteIPHost,然后在GetWaitingClient时则不必再设置RemoteIPHost,这种情况一般适用于客户端。第二种则是不配置SetRemoteIPHost,然后在GetWaitingClient时设置RemoteIPHost,这种情况适用于服务器。

提示

在SendThenReturn时,通过其他参数,还可以设置Timeout,以及可取消的等待Token。

提示

实际上上述行为,只要实现IClient, IDefaultSender, ISend三个接口的类均可以使用。

注意事项
  1. 发送完数据,在等待时,如果收到其他返回数据,则可能得到错误结果。
  2. 发送采用Lock锁,一个事务没结束,另一个请求也发不出去。