1
This commit is contained in:
@@ -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)
|
||||
|
@@ -49,6 +49,8 @@ namespace BITKit.Net
|
||||
BIT4Log.Log<KCPNetServer>("已创建KCP服务器");
|
||||
|
||||
AddCommandListener<SimplePing>(F);
|
||||
|
||||
AddRpcHandle(this);
|
||||
return;
|
||||
UniTask<SimplePing> F(SimplePing p)
|
||||
{
|
||||
@@ -208,7 +210,7 @@ namespace BITKit.Net
|
||||
|
||||
|
||||
using var returnMS = new MemoryStream();
|
||||
using var returnWriter = new BinaryWriter(returnMS);
|
||||
await using var returnWriter = new BinaryWriter(returnMS);
|
||||
returnWriter.Write((byte)NetCommandType.ReturnToClient);
|
||||
returnWriter.Write(requestId);
|
||||
|
||||
@@ -218,9 +220,24 @@ namespace BITKit.Net
|
||||
{
|
||||
var path = reader.ReadString();
|
||||
var pars = BITBinary.Read(reader).As<object[]>();
|
||||
|
||||
|
||||
if (_rpcMethods.TryGetValue(path, out var methodInfo))
|
||||
{
|
||||
var value = methodInfo.Invoke(_rpcHandles[path], pars);
|
||||
var isAwaitable = methodInfo.ReturnType.GetMethod(nameof(Task.GetAwaiter)) != null;
|
||||
var handle = _rpcHandles[path];
|
||||
object value = null;
|
||||
if (isAwaitable)
|
||||
{
|
||||
dynamic result = methodInfo.Invoke(handle, pars)!;
|
||||
|
||||
value = await result;
|
||||
}
|
||||
else
|
||||
{
|
||||
value = methodInfo.Invoke(handle, pars);
|
||||
}
|
||||
|
||||
returnWriter.Write(true);
|
||||
BITBinary.Write(returnWriter, value);
|
||||
}
|
||||
@@ -233,7 +250,8 @@ namespace BITKit.Net
|
||||
}
|
||||
else
|
||||
{
|
||||
var commandObj = BITBinary.Read(reader);
|
||||
var commandObj = BITBinary.Read(reader)
|
||||
.As<object[]>()[0];
|
||||
if (_rpc.TryGetValue(commandObj.GetType()!.FullName!, out var func))
|
||||
{
|
||||
try
|
||||
@@ -252,7 +270,7 @@ namespace BITKit.Net
|
||||
else
|
||||
{
|
||||
returnWriter.Write(false);
|
||||
returnWriter.Write("未找到对应的Rpc方法");
|
||||
returnWriter.Write("未找到对应的command方法");
|
||||
}
|
||||
}
|
||||
{
|
||||
@@ -310,12 +328,12 @@ namespace BITKit.Net
|
||||
Send(id,NetCommandType.Command,command);
|
||||
}
|
||||
|
||||
public UniTask<T> GetFromServer<T>(string path=default,T command = default)
|
||||
public UniTask<T> GetFromServer<T>(string path=default,params object[] pars)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public async UniTask<T> GetFromClient<T>(int id,string path=default, T command = default)
|
||||
public async UniTask<T> GetFromClient<T>(int id,string path=default, params object[] pars)
|
||||
{
|
||||
var index = _index++;
|
||||
using var ms = new MemoryStream();
|
||||
@@ -331,7 +349,7 @@ namespace BITKit.Net
|
||||
writer.Write(true);
|
||||
writer.Write(path);
|
||||
}
|
||||
BITBinary.Write(writer,command);
|
||||
BITBinary.Write(writer,pars);
|
||||
|
||||
var bytes = ms.ToArray();
|
||||
server.Send(id,bytes,KcpChannel.Reliable);
|
||||
@@ -355,7 +373,24 @@ 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);
|
||||
}
|
||||
}
|
||||
[NetRpc]
|
||||
public string MyRpcTest(string hello)
|
||||
{
|
||||
return "Hello World";
|
||||
}
|
||||
[NetRpc]
|
||||
public async UniTask<string> MyRpcTestAsync(string hello)
|
||||
{
|
||||
await Task.Delay(1000);
|
||||
return $"{hello} World";
|
||||
}
|
||||
|
||||
public void AddCommandListener<T>(Action<T> handle)
|
||||
|
Reference in New Issue
Block a user