This commit is contained in:
CortexCore
2024-06-12 16:49:42 +08:00
parent 126131b842
commit dab0eec438
7 changed files with 143 additions and 47 deletions

View File

@@ -208,38 +208,63 @@ namespace BITKit.Net
var requestId = reader.ReadInt32();
using var _ms = new MemoryStream();
using var _writer = new BinaryWriter(_ms);
_writer.Write((byte)NetCommandType.ReturnToServer);
_writer.Write(requestId);
using var returnMS = new MemoryStream();
await using var returnWriter = new BinaryWriter(returnMS);
returnWriter.Write((byte)NetCommandType.ReturnToServer);
returnWriter.Write(requestId);
try
{
object value = null;
if (reader.ReadBoolean())
{
var path = reader.ReadString();
var method = _rpcMethods[path];
var pars = BITBinary.Read(reader).As<object[]>();
value = method.Invoke(_rpcHandles[path],pars);
if (_rpcMethods.TryGetValue(path, out var methodInfo))
{
var isAwaitable = methodInfo.ReturnType.GetMethod(nameof(Task.GetAwaiter)) != null;
var handle = _rpcHandles[path];
if (isAwaitable)
{
dynamic result = methodInfo.Invoke(handle, pars)!;
value = await result;
}
else
{
value = methodInfo.Invoke(handle, pars);
}
returnWriter.Write(true);
BITBinary.Write(returnWriter, value);
}
else
{
returnWriter.Write(false);
returnWriter.Write("未找到对应的Rpc方法");
}
}
else
{
var commandObj = BITBinary.Read(reader);
var commandObj = BITBinary.Read(reader)
.As<object[]>()[0];
var func = _rpc[commandObj.GetType()!.FullName!];
value = await func.As<Func<object, UniTask<object>>>().Invoke(commandObj);
}
_writer.Write(true);
BITBinary.Write(_writer, value);
var _bytes = _ms.ToArray();
commandQueue.Enqueue(_bytes);
returnWriter.Write(true);
BITBinary.Write(returnWriter, value);
}
catch (Exception e)
{
BIT4Log.LogException(e);
_writer.Write(false);
_writer.Write(e.Message);
returnWriter.Write(false);
returnWriter.Write(e.Message);
}
var _bytes = returnMS.ToArray();
commandQueue.Enqueue(_bytes);
}
catch(Exception e)
{
@@ -302,7 +327,7 @@ namespace BITKit.Net
Send(NetCommandType.TargetCommand,id,command);
}
public async UniTask<T> GetFromServer<T>(string path = default,T command = default)
public async UniTask<T> GetFromServer<T>(string path = default,params object[] pars)
{
var id = _index++;
using var ms = new MemoryStream();
@@ -318,7 +343,7 @@ namespace BITKit.Net
writer.Write(true);
writer.Write(path);
}
BITBinary.Write(writer,command);
BITBinary.Write(writer,pars);
var bytes = ms.ToArray();
commandQueue.Enqueue(bytes);
@@ -340,7 +365,7 @@ namespace BITKit.Net
}
}
public UniTask<T> GetFromClient<T>(int id,string path, T command = default)
public UniTask<T> GetFromClient<T>(int id,string path, params object[] pars)
{
throw new NotImplementedException();
}
@@ -348,7 +373,13 @@ namespace BITKit.Net
public void AddRpcHandle(object rpcHandle)
{
throw new NotImplementedException();
foreach (var methodInfo in rpcHandle.GetType().GetMethods())
{
var att = methodInfo.GetCustomAttribute<NetRpcAttribute>();
if(att is null)continue;
_rpcMethods.TryAdd(methodInfo.Name, methodInfo);
_rpcHandles.TryAdd(methodInfo.Name, rpcHandle);
}
}
public void AddCommandListener<T>(Action<T> handle)