#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); } } }