#region copyright
//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
// 使用文档:https://diego2098.gitee.io/thingsgateway-docs/
// QQ群:605534569
//------------------------------------------------------------------------------
#endregion
//------------------------------------------------------------------------------
// 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有
// 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权
// CSDN博客:https://blog.csdn.net/qq_40374647
// 哔哩哔哩视频:https://space.bilibili.com/94253567
// Gitee源代码仓库:https://gitee.com/RRQM_Home
// Github源代码仓库:https://github.com/RRQM
// API首页:http://rrqm_home.gitee.io/touchsocket/
// 交流QQ群:234762506
// 感谢您的下载和使用
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
using System.Net;
namespace ThingsGateway.Foundation.Dmtp.Rpc
{
///
/// UdpDmtp终端客户端
///
internal sealed class UdpDmtpClient : DmtpActor, IUdpDmtpClient
{
private readonly EndPoint m_endPoint;
private readonly UdpSessionBase m_udpSession;
private IPluginsManager pluginsManager;
///
/// UdpDmtp终端客户端
///
///
///
///
public UdpDmtpClient(UdpSessionBase udpSession, EndPoint endPoint, ILog logger) : base(false, false)
{
this.Id = endPoint.ToString();
this.OutputSend = this.RpcActorSend;
this.OutputSendAsync = this.RpcActorSendAsync;
this.CreatedChannel = this.OnDmtpActorCreatedChannel;
this.m_udpSession = udpSession;
this.m_endPoint = endPoint;
this.Logger = logger;
this.Client = this;
}
private Task OnDmtpActorCreatedChannel(DmtpActor actor, CreateChannelEventArgs e)
{
return this.pluginsManager.RaiseAsync(nameof(IDmtpCreateChannelPlugin.OnCreateChannel), this, e);
}
public bool Created(IPluginsManager pluginsManager)
{
this.pluginsManager = pluginsManager;
var args = new DmtpVerifyEventArgs()
{
Id = this.Id,
IsPermitOperation = true
};
pluginsManager.Raise(nameof(IDmtpHandshakingPlugin.OnDmtpHandshaking), this, args);
if (args.IsPermitOperation == false)
{
return false;
}
this.IsHandshaked = true;
args = new DmtpVerifyEventArgs()
{
Id = this.Id
};
pluginsManager.Raise(nameof(IDmtpHandshakedPlugin.OnDmtpHandshaked), this, args);
return true;
}
///
public IDmtpActor DmtpActor => this;
///
public EndPoint EndPoint => this.m_endPoint;
///
public IUdpSession UdpSession => this.m_udpSession;
///
/// 不支持该操作
///
///
/// 该客户端的Id为实际通信EndPoint值,所以不支持重置Id的操作。
public override void ResetId(string id)
{
throw new NotSupportedException("该客户端的Id为实际通信EndPoint值,所以不支持重置Id的操作。");
}
///
/// 不支持该操作
///
///
///
/// 该客户端的Id为实际通信EndPoint值,所以不支持重置Id的操作。
public override Task ResetIdAsync(string id)
{
throw new NotSupportedException("该客户端的Id为实际通信EndPoint值,所以不支持重置Id的操作。");
}
private void RpcActorSend(DmtpActor actor, ArraySegment[] transferBytes)
{
this.m_udpSession.Send(this.m_endPoint, transferBytes);
}
private Task RpcActorSendAsync(DmtpActor actor, ArraySegment[] transferBytes)
{
return this.m_udpSession.SendAsync(this.m_endPoint, transferBytes);
}
}
}