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(); var requestId = reader.ReadInt32();
using var _ms = new MemoryStream(); using var returnMS = new MemoryStream();
using var _writer = new BinaryWriter(_ms); await using var returnWriter = new BinaryWriter(returnMS);
_writer.Write((byte)NetCommandType.ReturnToServer); returnWriter.Write((byte)NetCommandType.ReturnToServer);
_writer.Write(requestId); returnWriter.Write(requestId);
try try
{ {
object value = null; object value = null;
if (reader.ReadBoolean()) if (reader.ReadBoolean())
{ {
var path = reader.ReadString(); var path = reader.ReadString();
var method = _rpcMethods[path];
var pars = BITBinary.Read(reader).As<object[]>(); 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 else
{ {
var commandObj = BITBinary.Read(reader); var commandObj = BITBinary.Read(reader)
.As<object[]>()[0];
var func = _rpc[commandObj.GetType()!.FullName!]; var func = _rpc[commandObj.GetType()!.FullName!];
value = await func.As<Func<object, UniTask<object>>>().Invoke(commandObj); value = await func.As<Func<object, UniTask<object>>>().Invoke(commandObj);
} }
_writer.Write(true); returnWriter.Write(true);
BITBinary.Write(_writer, value); BITBinary.Write(returnWriter, value);
var _bytes = _ms.ToArray();
commandQueue.Enqueue(_bytes);
} }
catch (Exception e) catch (Exception e)
{ {
BIT4Log.LogException(e); BIT4Log.LogException(e);
_writer.Write(false); returnWriter.Write(false);
_writer.Write(e.Message); returnWriter.Write(e.Message);
} }
var _bytes = returnMS.ToArray();
commandQueue.Enqueue(_bytes);
} }
catch(Exception e) catch(Exception e)
{ {
@ -302,7 +327,7 @@ namespace BITKit.Net
Send(NetCommandType.TargetCommand,id,command); 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++; var id = _index++;
using var ms = new MemoryStream(); using var ms = new MemoryStream();
@ -318,7 +343,7 @@ namespace BITKit.Net
writer.Write(true); writer.Write(true);
writer.Write(path); writer.Write(path);
} }
BITBinary.Write(writer,command); BITBinary.Write(writer,pars);
var bytes = ms.ToArray(); var bytes = ms.ToArray();
commandQueue.Enqueue(bytes); 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(); throw new NotImplementedException();
} }
@ -348,7 +373,13 @@ namespace BITKit.Net
public void AddRpcHandle(object rpcHandle) 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) public void AddCommandListener<T>(Action<T> handle)

View File

@ -49,6 +49,8 @@ namespace BITKit.Net
BIT4Log.Log<KCPNetServer>("已创建KCP服务器"); BIT4Log.Log<KCPNetServer>("已创建KCP服务器");
AddCommandListener<SimplePing>(F); AddCommandListener<SimplePing>(F);
AddRpcHandle(this);
return; return;
UniTask<SimplePing> F(SimplePing p) UniTask<SimplePing> F(SimplePing p)
{ {
@ -208,7 +210,7 @@ namespace BITKit.Net
using var returnMS = new MemoryStream(); 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((byte)NetCommandType.ReturnToClient);
returnWriter.Write(requestId); returnWriter.Write(requestId);
@ -218,9 +220,24 @@ namespace BITKit.Net
{ {
var path = reader.ReadString(); var path = reader.ReadString();
var pars = BITBinary.Read(reader).As<object[]>(); var pars = BITBinary.Read(reader).As<object[]>();
if (_rpcMethods.TryGetValue(path, out var methodInfo)) 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); returnWriter.Write(true);
BITBinary.Write(returnWriter, value); BITBinary.Write(returnWriter, value);
} }
@ -233,7 +250,8 @@ namespace BITKit.Net
} }
else else
{ {
var commandObj = BITBinary.Read(reader); var commandObj = BITBinary.Read(reader)
.As<object[]>()[0];
if (_rpc.TryGetValue(commandObj.GetType()!.FullName!, out var func)) if (_rpc.TryGetValue(commandObj.GetType()!.FullName!, out var func))
{ {
try try
@ -252,7 +270,7 @@ namespace BITKit.Net
else else
{ {
returnWriter.Write(false); returnWriter.Write(false);
returnWriter.Write("未找到对应的Rpc方法"); returnWriter.Write("未找到对应的command方法");
} }
} }
{ {
@ -310,12 +328,12 @@ namespace BITKit.Net
Send(id,NetCommandType.Command,command); 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(); 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++; var index = _index++;
using var ms = new MemoryStream(); using var ms = new MemoryStream();
@ -331,7 +349,7 @@ namespace BITKit.Net
writer.Write(true); writer.Write(true);
writer.Write(path); writer.Write(path);
} }
BITBinary.Write(writer,command); BITBinary.Write(writer,pars);
var bytes = ms.ToArray(); var bytes = ms.ToArray();
server.Send(id,bytes,KcpChannel.Reliable); server.Send(id,bytes,KcpChannel.Reliable);
@ -355,7 +373,24 @@ namespace BITKit.Net
public void AddRpcHandle(object rpcHandle) 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) public void AddCommandListener<T>(Action<T> handle)

View File

@ -6,20 +6,20 @@ namespace BITKit
{ {
public static T As<T>(this object self) where T : class public static T As<T>(this object self) where T : class
{ {
{ // {
if (typeof(T) == typeof(object[])) // if (typeof(T) == typeof(object[]))
{ // {
var o = new object[1]; // var o = new object[1];
o[0] = self; // o[0] = self;
return o as T; // return o as T;
} // }
} // }
{ // {
if (self is object[] { Length: 1 } o) // if (self is object[] { Length: 1 } o)
{ // {
return o[0] as T; // return o[0] as T;
} // }
} // }
return self as T; return self as T;
} }
} }

View File

@ -15,6 +15,11 @@ using UnityEngine;
namespace BITKit namespace BITKit
{ {
[AttributeUsage(AttributeTargets.Method)]
public sealed class NetRpcAttribute : Attribute
{
}
/// <summary> /// <summary>
/// 网络指令类型 /// 网络指令类型
/// </summary> /// </summary>
@ -74,7 +79,7 @@ namespace BITKit
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <returns></returns> /// <returns></returns>
UniTask<T> GetFromServer<T>(string path = null,T command = default); UniTask<T> GetFromServer<T>(string path = null,params object[] pars);
/// <summary> /// <summary>
/// 从客户端获取数据 /// 从客户端获取数据
@ -83,7 +88,7 @@ namespace BITKit
/// <param name="addressablePath">可寻址路劲 e.g. Key</param> /// <param name="addressablePath">可寻址路劲 e.g. Key</param>
/// <typeparam name="T">远程指令类型</typeparam> /// <typeparam name="T">远程指令类型</typeparam>
/// <returns></returns> /// <returns></returns>
UniTask<T> GetFromClient<T>(int id,string path = null,T command = default); UniTask<T> GetFromClient<T>(int id,string path = null,params object[] pars);
/// <summary> /// <summary>
/// 添加RPC远程服务服务类型为需要的方法标记[RPC] /// 添加RPC远程服务服务类型为需要的方法标记[RPC]

View File

@ -89,9 +89,9 @@ namespace BITKit.Net
_netProviderImplementation.ClientCommand(id, command); _netProviderImplementation.ClientCommand(id, command);
} }
public UniTask<T> GetFromServer<T>(string path=default,T command = default)=>_netProviderImplementation.GetFromServer<T>(path,command); public UniTask<T> GetFromServer<T>(string path=default,params object[] pars)=>_netProviderImplementation.GetFromServer<T>(path,pars);
public UniTask<T> GetFromClient<T>(int id,string path=default, T command = default)=>_netProviderImplementation.GetFromClient(id,path, command); public UniTask<T> GetFromClient<T>(int id,string path=default, params object[] pars)=>_netProviderImplementation.GetFromClient<T>(id,path, pars);
public void AddRpcHandle(object rpcHandle) public void AddRpcHandle(object rpcHandle)
{ {

View File

@ -96,6 +96,16 @@ namespace BITKit.Net.Kcp
_netProviderImplementation.ClientCommand(id, command); _netProviderImplementation.ClientCommand(id, command);
} }
public UniTask<T> GetFromServer<T>(string path = null, params object[] pars)
{
return client.GetFromServer<T>(path, pars);
}
public UniTask<T> GetFromClient<T>(int id, string path = null, params object[] pars)
{
return client.GetFromClient<T>(id, path, pars);
}
public UniTask<T> GetFromServer<T>(string path=null,T command = default) public UniTask<T> GetFromServer<T>(string path=null,T command = default)
{ {
return _netProviderImplementation.GetFromServer<T>(path,command); return _netProviderImplementation.GetFromServer<T>(path,command);
@ -232,6 +242,21 @@ namespace BITKit.Net.Kcp
StartTime = DateTime.Now StartTime = DateTime.Now
}); });
BIT4Log.Log<MonoKcpClient>($"已返回\n开始:{value.StartTime}\n结束:{value.EndTime}\n延迟:{(value.EndTime-value.StartTime).TotalMilliseconds}ms"); BIT4Log.Log<MonoKcpClient>($"已返回\n开始:{value.StartTime}\n结束:{value.EndTime}\n延迟:{(value.EndTime-value.StartTime).TotalMilliseconds}ms");
var hello =
await GetFromServer<string>(
nameof(KCPNetServer.MyRpcTest),
"hello"
);
BIT4Log.Log<MonoKcpClient>($"已返回\n{hello}");
var helloAsync =
await GetFromServer<string>(
nameof(KCPNetServer.MyRpcTestAsync),
"hello"
);
BIT4Log.Log<MonoKcpClient>($"已返回\n{helloAsync}");
} }
} }
} }

View File

@ -113,14 +113,14 @@ namespace BITKit.Net.Kcp
_server.ClientCommand(id, command); _server.ClientCommand(id, command);
} }
public UniTask<T> GetFromServer<T>(string path = null,T command = default) public UniTask<T> GetFromServer<T>(string path = null, params object[] pars)
{ {
return _serverInstance.GetFromServer(path,command); return _serverInstance.GetFromServer<T>(path, pars);
} }
public UniTask<T> GetFromClient<T>(int id,string path = null, T command = default) public UniTask<T> GetFromClient<T>(int id, string path = null, params object[] pars)
{ {
return _serverInstance.GetFromClient(id,path, command); return _serverInstance.GetFromClient<T>(id, path, pars);
} }
public void AddRpcHandle(object rpcHandle) public void AddRpcHandle(object rpcHandle)
{ {