更新了网络服务接口定义

This commit is contained in:
CortexCore
2023-06-07 02:02:14 +08:00
parent 08b05f8a74
commit b2444fd909
2727 changed files with 20455 additions and 4448 deletions

View File

@@ -39,11 +39,12 @@ namespace BITKit
}
}
public static object Read<T>(byte[] buffer)
public static object Read<T>(byte[] buffer) => (T)ReadAsValue(buffer);
public static object ReadAsValue(byte[] buffer)
{
using var ms = new MemoryStream(buffer);
using var reader = new BinaryReader(ms);
return (T)Read(reader);
return Read(reader);
}
public static object Read(BinaryReader reader)
{
@@ -74,7 +75,7 @@ namespace BITKit
public static void Write(BinaryWriter writer, object value)
{
var typeName = value.GetType().FullName;
writer.Write(typeName);
writer.Write(typeName!);
if (netReaders.TryGetValue(typeName, out var netReader))
{
netReader.WriteBinaryAsObject(writer,value);
@@ -85,9 +86,12 @@ namespace BITKit
}
else
{
throw new Exception(string.Format("没有找到{0}而二进制写入方法", value.GetType().Name));
throw new Exception($"没有找到{value.GetType().Name}的Binary写入方法");
}
}
public static bool IsSupport(object obj) => IsSupport(obj.GetType().FullName);
public static bool IsSupport(Type type) => IsSupport(type.FullName);
public static bool IsSupport<T>() => IsSupport(typeof(T).FullName);
public static bool IsSupport(string typeName)
{
if (netReaders.ContainsKey(typeName))
@@ -100,6 +104,18 @@ namespace BITKit
}
return false;
}
public static bool IsSupport(Type type) => IsSupport(type.FullName);
public static bool TryWrite(object obj, out byte[] bytes)
{
if (IsSupport(obj))
{
bytes = WriteAsBytes(obj);
return true;
}
bytes = null;
return false;
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace BITKit
{
public class IEnumerableSupport:NetMessageReader<object[]>
{
public override object[] ReadBinary(BinaryReader reader)
{
var length = reader.ReadInt32();
var objects = new object[length];
for (int i = 0; i < length; i++)
{
var count = reader.Read();
objects[i] = BITBinary.ReadAsValue(reader.ReadBytes(count));
}
return objects;
}
public override void WriteBinary(BinaryWriter writer, object[] value)
{
writer.Write(value.Length);
foreach (var x in value)
{
var bytes = BITBinary.WriteAsBytes(x);
writer.Write(bytes.Length);
writer.Write(bytes);
}
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4aa297ea312f2eb4683594f01c5e3a52
guid: f98dd998de70fdb42aad67eda57350ce
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@@ -0,0 +1,56 @@
using System.Collections;
using System.Collections.Generic;
using System.IO;
namespace BITKit
{
public class IntSupport : NetMessageReader<int>
{
public override int ReadBinary(BinaryReader reader)
{
return reader.ReadInt32();
}
public override void WriteBinary(BinaryWriter writer, int value)
{
writer.Write(value);
}
}
public class FloatSupport : NetMessageReader<float>
{
public override float ReadBinary(BinaryReader reader)
{
return reader.ReadSingle().Fix();
}
public override void WriteBinary(BinaryWriter writer, float value)
{
writer.Write(value);
}
}
public class StringSupport : NetMessageReader<string>
{
public override string ReadBinary(BinaryReader reader)
{
return reader.ReadString();
}
public override void WriteBinary(BinaryWriter writer, string value)
{
writer.Write(value);
}
}
public class BoolSupport: NetMessageReader<bool>
{
public override bool ReadBinary(BinaryReader reader)
{
return reader.ReadBoolean();
}
public override void WriteBinary(BinaryWriter writer, bool value)
{
writer.Write(value);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 22f57f76c9979f647a2e6d69f45e9952
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,32 +1,134 @@
using System;
using System.Collections;
using System.Collections.Generic;
#if UNITY
using UnityEngine;
#endif
/*
* 该接口为基础的网络接口,包括了网络服务,服务端接口,客户端接口的基本定义 e.g.
* ⭐INetProvider 网络服务接口的基本定义
* ⭐INetServer 服务端接口的基本定义
* ⭐INetClient 客户端接口的基本定义
*/
using Cysharp.Threading.Tasks;
namespace BITKit
{
/// <summary>
/// 网络提供服务包括了基础网络服务e.g
/// ⭐向服务器发送指令
/// ⭐向所有客户端发送指令
/// ⭐向单个客户端发送指令
/// ⭐监听与取消监听网络命令
/// ⭐从服务器获取数据
/// ⭐从客户端获取数据
/// ⭐添加Rpc处理服务
/// ⭐向服务器发送Rpc
/// ⭐向所有客户端发送Rpc
/// </summary>
public interface INetProvider
{
void ServerRpc(Action<string> action, params object[] pars);
void ServerRpc(Action<object> action, params object[] pars);
/// <summary>
/// 向服务端发送指令
/// </summary>
/// <typeparam name="T"></typeparam>
void ServerCommand<T>();
/// <summary>
/// 向所有客户端发送指令
/// </summary>
/// <typeparam name="T">远程指令类型</typeparam>
void RpcClientCommand<T>();
/// <summary>
/// 向单个客户端发送指令
/// </summary>
/// <param name="id">客户端ID</param>
/// <typeparam name="T">远程指令类型</typeparam>
void ClientCommand<T>(int id);
/// <summary>
/// 从服务端获取数据
/// </summary>
/// <param name="addressablePath">可寻址路劲 e.g. Key</param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
UniTask<T> GetFromServer<T>(string addressablePath=Constant.System.Internal);
/// <summary>
/// 从客户端获取数据
/// </summary>
/// <param name="id">客户端ID</param>
/// <param name="addressablePath">可寻址路劲 e.g. Key</param>
/// <typeparam name="T">远程指令类型</typeparam>
/// <returns></returns>
UniTask<T> GetFromClient<T>(int id,string addressablePath=Constant.System.Internal);
/// <summary>
/// 添加RPC远程服务服务类型为需要的方法标记[RPC]
/// </summary>
/// <param name="rpcHandle">RPC服务实例</param>
void AddRpcHandle(object rpcHandle);
/// <summary>
/// 监听远程指令
/// </summary>
/// <param name="handle">远程指令回调</param>
/// <typeparam name="T">远程指令类型</typeparam>
void AddCommandListener<T>(Action<T> handle);
/// <summary>
/// 取消监听远程指令
/// </summary>
/// <param name="handle">远程指令回调</param>
/// <typeparam name="T">远程指令类型</typeparam>
void RemoveCommandListener<T>(Action<T> handle);
/// <summary>
/// 向服务端发送Rpc
/// </summary>
/// <param name="rpcName">RPC名称</param>
/// <param name="pars">RPC参数</param>
void SendRT(string rpcName, params object[] pars);
/// <summary>
/// 向指定客户端发送Rpc
/// </summary>
/// <param name="id">远程客户端Id</param>
/// <param name="rpcName">RPC名称</param>
/// <param name="pars">RPC参数</param>
void SendTargetRT(int id, string rpcName, params object[] pars);
/// <summary>
/// 向所有客户端发送Rpc
/// </summary>
/// <param name="rpcName">RPC名称</param>
/// <param name="pars">RPC参数</param>
void SendAllRT(string rpcName, params object[] pars);
#if UNITY
void ServerRpc(Action<UnityEngine.Object> action, params object[] pars);
void ClientRpc(Action<UnityEngine.Object> action, params object[] pars);
void ServerRpc(Action<UnityEngine.GameObject> action, params object[] pars);
void ClientRpc(Action<UnityEngine.GameObject> action, params object[] pars);
#endif
////void ServerRpc<T>(Action<T> action,params object[] pars);
}
/// <summary>
/// 服务端接口,支持服务端的基本功能
/// ⭐开启服务器(支持指定端口)
/// ⭐停止服务器
/// ⭐服务器运行状态
/// </summary>
public interface INetServer
{
/// <summary>
/// 回调:当客户端连接时
/// </summary>
public event Action<int> OnClientConnect;
/// <summary>
/// 回调:当客户端断开连接时
/// </summary>
public event Action<int> OnClientDisconnected;
/// <summary>
/// 运行服务端
/// </summary>
/// <param name="port">端口默认为27014</param>
void StartServer(ushort port = 27014);
void StopServer();
/// <summary>
/// 停止服务端
/// </summary>
/// <param name="dispose">可选参数强行释放默认为false</param>
void StopServer(bool dispose);
/// <summary>
/// (只读)服务器是否正在运行
/// </summary>
bool IsRunningServer { get; }
}
public interface INetClient
{
public event Action OnConnected;
public event Action OnDisconnected;
public event Action OnConnectedFailed;
UniTask<bool> Connect(string address="localhost",ushort port=27014);
bool IsConnected { get; }
int Ping { get; }
void Disconnect();
}
}

View File

@@ -1,29 +0,0 @@
using System.Collections;
using System.Collections.Generic;
#if UNITY
using UnityEngine;
namespace BITKit
{
public class NetServiceSample:MonoBehaviour
{
[SerializeField,SerializeReference,SubclassSelector]
private INetProvider netProvider;
public void Main()
{
GameObject player = new("Player");
//Good Code
netProvider.ServerRpc(KillPlayer,player);
netProvider.ClientRpc(KillPlayer,player);
//Bad Code
netProvider.SendRT(nameof(KillPlayer),player);
netProvider.SendAllRT(nameof(KillPlayer),player);
}
public void KillPlayer(GameObject player)
{
}
}
}
#endif

View File

@@ -36,7 +36,7 @@ namespace BITKit
}
public static string Get<T>(T obj)
{
return JsonConvert.SerializeObject(obj);
return JsonConvert.SerializeObject(obj,Formatting.Indented);
}
public static T Get<T>(byte[] buffer)
{