//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在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首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; using TouchSocket.Core; using TouchSocket.Http; using TouchSocket.Sockets; namespace TouchSocket.Rpc.TouchRpc { /// /// Http服务器辅助类 /// public partial class HttpTouchRpcSocketClient : HttpSocketClient, IHttpTouchRpcSocketClient { internal Action m_internalOnRpcActorInit; private RpcActor m_rpcActor; /// public bool IsHandshaked => m_rpcActor == null ? false : m_rpcActor.IsHandshaked; /// public string RootPath { get => m_rpcActor.RootPath; set => m_rpcActor.RootPath = value; } /// public RpcActor RpcActor => m_rpcActor; /// public SerializationSelector SerializationSelector => m_rpcActor.SerializationSelector; /// public Func TryCanInvoke { get; set; } /// /// 连接令箭 /// public string VerifyToken => Config.GetValue(TouchRpcConfigExtensions.VerifyTokenProperty); /// public bool ChannelExisted(int id) { return m_rpcActor.ChannelExisted(id); } /// public Channel CreateChannel() { return m_rpcActor.CreateChannel(); } /// public Channel CreateChannel(int id) { return m_rpcActor.CreateChannel(id); } /// public Channel CreateChannel(string targetId) { return m_rpcActor.CreateChannel(targetId); } /// public Channel CreateChannel(string targetId, int id) { return m_rpcActor.CreateChannel(targetId, id); } /// public void Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { m_rpcActor.Invoke(method, invokeOption, parameters); } /// public T Invoke(string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.Invoke(method, invokeOption, parameters); } /// public T Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { return m_rpcActor.Invoke(method, invokeOption, ref parameters, types); } /// public void Invoke(string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { m_rpcActor.Invoke(method, invokeOption, ref parameters, types); } /// public void Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) { m_rpcActor.Invoke(id, method, invokeOption, parameters); } /// public T Invoke(string id, string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.Invoke(id, method, invokeOption, parameters); } /// public void Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); } /// public T Invoke(string targetId, string method, IInvokeOption invokeOption, ref object[] parameters, Type[] types) { return m_rpcActor.Invoke(targetId, method, invokeOption, ref parameters, types); } /// public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.InvokeAsync(method, invokeOption, parameters); } /// public Task InvokeAsync(string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.InvokeAsync(method, invokeOption, parameters); } /// public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); } /// public Task InvokeAsync(string id, string method, IInvokeOption invokeOption, params object[] parameters) { return m_rpcActor.InvokeAsync(id, method, invokeOption, parameters); } /// public bool Ping(string targetId, int timeout = 5000) { return m_rpcActor.Ping(targetId, timeout); } /// public bool Ping(int timeout = 5000) { return m_rpcActor.Ping(timeout); } /// public Result PullFile(FileOperator fileOperator) { return m_rpcActor.PullFile(fileOperator); } /// public Result PullFile(string targetId, FileOperator fileOperator) { return m_rpcActor.PullFile(targetId, fileOperator); } /// public Task PullFileAsync(FileOperator fileOperator) { return m_rpcActor.PullFileAsync(fileOperator); } /// public Task PullFileAsync(string targetId, FileOperator fileOperator) { return m_rpcActor.PullFileAsync(targetId, fileOperator); } /// public Result PushFile(FileOperator fileOperator) { return m_rpcActor.PushFile(fileOperator); } /// public Result PushFile(string targetId, FileOperator fileOperator) { return m_rpcActor.PushFile(targetId, fileOperator); } /// public Task PushFileAsync(FileOperator fileOperator) { return m_rpcActor.PushFileAsync(fileOperator); } /// public Task PushFileAsync(string targetId, FileOperator fileOperator) { return m_rpcActor.PushFileAsync(targetId, fileOperator); } /// public override void ResetID(string newID) { m_rpcActor.ResetID(newID); DirectResetID(newID); } /// public Result SendStream(Stream stream, StreamOperator streamOperator, Metadata metadata = null) { return m_rpcActor.SendStream(stream, streamOperator, metadata); } /// public Task SendStreamAsync(Stream stream, StreamOperator streamOperator, Metadata metadata = null) { return m_rpcActor.SendStreamAsync(stream, streamOperator, metadata); } /// public bool TrySubscribeChannel(int id, out Channel channel) { return m_rpcActor.TrySubscribeChannel(id, out channel); } internal void RpcActorSend(ArraySegment[] transferBytes) { base.Send(transferBytes); } internal void SetRpcActor(RpcActor rpcActor) { m_rpcActor = rpcActor; m_rpcActor.OnResetID = ThisOnResetID; } /// /// /// /// protected override void Dispose(bool disposing) { m_rpcActor.SafeDispose(); base.Dispose(disposing); } /// /// /// /// /// protected override void HandleReceivedData(ByteBlock byteBlock, IRequestInfo requestInfo) { if (Protocol == TouchRpcUtility.TouchRpcProtocol && byteBlock != null) { m_rpcActor.InputReceivedData(byteBlock); } else { base.HandleReceivedData(byteBlock, requestInfo); } } /// /// /// /// protected override void OnDisconnected(DisconnectEventArgs e) { m_rpcActor?.Close(e.Message); base.OnDisconnected(e); } /// /// /// /// protected override void OnReceivedHttpRequest(HttpRequest request) { if (request.Method == TouchRpcUtility.TouchRpc) { request.SafeDispose(); InitRpcActor(); this.DefaultSend(new HttpResponse().SetStatus().BuildAsBytes()); return; } base.OnReceivedHttpRequest(request); } private void InitRpcActor() { this.SwitchProtocolToTouchRpc(); m_internalOnRpcActorInit?.Invoke(this); m_rpcActor.ID = ID; } private void ThisOnResetID(bool first, RpcActor rpcActor, WaitSetID waitSetID) { DirectResetID(waitSetID.NewID); } #region 发送 /// public void Send(short protocol, byte[] buffer, int offset, int length) { m_rpcActor.Send(protocol, buffer, offset, length); } /// /// 不允许直接发送 /// /// /// /// public override void Send(byte[] buffer, int offset, int length) { throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); } /// /// 不允许直接发送 /// /// public override void Send(IList> transferBytes) { throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); } /// /// /// /// /// /// /// public Task SendAsync(short protocol, byte[] buffer, int offset, int length) { return m_rpcActor.SendAsync(protocol, buffer, offset, length); } /// /// 不允许直接发送 /// /// /// /// public override Task SendAsync(byte[] buffer, int offset, int length) { throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); } /// /// 不允许直接发送 /// /// public override Task SendAsync(IList> transferBytes) { throw new Exception("不允许直接发送,请指定任意大于0的协议,然后发送。"); } #endregion 发送 #region 小文件 /// public PullSmallFileResult PullSmallFile(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PullSmallFile(targetId, path, metadata, timeout, token); } /// public PullSmallFileResult PullSmallFile(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PullSmallFile(path, metadata, timeout, token); } /// public Task PullSmallFileAsync(string targetId, string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PullSmallFileAsync(targetId, path, metadata, timeout, token); } /// public Task PullSmallFileAsync(string path, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PullSmallFileAsync(path, metadata, timeout, token); } /// public Result PushSmallFile(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PushSmallFile(targetId, savePath, fileInfo, metadata, timeout, token); } /// public Result PushSmallFile(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PushSmallFile(savePath, fileInfo, metadata, timeout, token); } /// public Task PushSmallFileAsync(string targetId, string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PushSmallFileAsync(targetId, savePath, fileInfo, metadata, timeout, token); } /// public Task PushSmallFileAsync(string savePath, FileInfo fileInfo, Metadata metadata = null, int timeout = 5000, CancellationToken token = default) { return m_rpcActor.PushSmallFileAsync(savePath, fileInfo, metadata, timeout, token); } #endregion 小文件 } }