This commit is contained in:
parent
126131b842
commit
dab0eec438
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue