/* * 该接口为基础的网络接口,包括了网络服务,服务端接口,客户端接口的基本定义 e.g. * ⭐INetProvider 网络通信接口的基本定义 * ⭐INetServer 服务端接口的基本定义 * ⭐INetClient 客户端接口的基本定义 */ using System; using System.Collections.Generic; using System.Net; using Cysharp.Threading.Tasks; #if UNITY using UnityEngine; #endif namespace BITKit { [AttributeUsage(AttributeTargets.Method|AttributeTargets.Event)] public sealed class NetRpcAttribute : Attribute { public readonly bool AddTypeNamePrefix; public NetRpcAttribute() { } public NetRpcAttribute(bool addTypeNamePrefix) { AddTypeNamePrefix = addTypeNamePrefix; } } /// /// 帮助类 /// public static class NetUtils { /// /// 计算文件大小函数(保留两位小数),Size为字节大小 /// /// 初始文件大小 /// public static string GetFileSize(long size) { var num = 1024.00; //byte if (size < num) return size + "B"; if (size < Math.Pow(num, 2)) return (size / num).ToString("f2") + "K"; //kb if (size < Math.Pow(num, 3)) return (size / Math.Pow(num, 2)).ToString("f2") + "M"; //M if (size < Math.Pow(num, 4)) return (size / Math.Pow(num, 3)).ToString("f2") + "G"; //G return (size / Math.Pow(num, 4)).ToString("f2") + "T"; //T } } /// /// 网络指令类型 /// public enum NetCommandType:byte { Undefined=0, Command=1, TargetCommand=2, File=3, Rpc=4, AllClientCommand=5, Message=6, Heartbeat=7, Ping=8, GetFromServer=9, GetFromClient=10, ReciveFile=11, ReturnToServer=12, ReturnToClient=13, TargetRpc=14, AllRpc=15, } /// /// 网络提供服务,包括了基础网络服务,e.g /// ⭐向服务器发送指令 /// ⭐向所有客户端发送指令 /// ⭐向单个客户端发送指令 /// ⭐监听与取消监听网络命令 /// ⭐从服务器获取数据 /// ⭐从客户端获取数据 /// ⭐添加Rpc处理服务 /// ⭐向服务器发送Rpc /// ⭐向所有客户端发送Rpc /// public interface INetProvider { /// /// 向服务端发送指令 /// /// 远程指令类型 void ServerCommand(T command = default); /// /// 向所有客户端发送指令 /// /// 远程指令类型 void AllClientCommand(T command = default); /// /// 向单个客户端发送指令 /// /// 客户端ID /// 指令实例 /// 远程指令类型 void ClientCommand(int id, T command); /// /// 从服务端获取数据 /// /// /// UniTask GetFromServer(string path = null,params object[] pars); /// /// 从客户端获取数据 /// /// 客户端ID /// 可寻址路劲 e.g. Key /// 远程指令类型 /// UniTask GetFromClient(int id,string path = null,params object[] pars); /// /// 添加RPC远程服务,服务类型为需要的方法标记[RPC] /// /// RPC服务实例 void AddRpcHandle(object rpcHandle); /// /// 监听远程指令 /// /// 远程指令回调 /// 远程指令类型 void AddCommandListener(Action handle); /// /// 取消监听远程指令 /// /// /// void RemoveCommandListener(Action handle); /// /// 监听远程func /// /// /// void AddCommandListener(Func> func); /// /// 取消监听远程指令 /// /// 远程指令回调 /// 远程指令类型 void RemoveCommandListener(Func> func); /// /// 向服务端发送Rpc /// /// RPC名称 /// RPC参数 void SendRT(string rpcName, params object[] pars); /// /// 向指定客户端发送Rpc /// /// 远程客户端Id /// RPC名称 /// RPC参数 void SendTargetRT(int id, string rpcName, params object[] pars); /// /// 向所有客户端发送Rpc /// /// RPC名称 /// RPC参数 void SendAllRT(string rpcName, params object[] pars); /// /// 更新Tick /// void Tick(); /// /// 连接协议握手 /// void HandShake(); } /// /// 服务端接口,支持服务端的基本功能 /// ⭐开启服务器(支持指定端口) /// ⭐停止服务器 /// ⭐服务器运行状态 /// public interface INetServer { /// /// 通信接口 /// public INetProvider NetProvider=>this as INetProvider; /// /// 源物体,用于通过代理直接访问 /// public object Source => this; /// /// 手动Tick /// public bool ManualTick { get; set; } /// /// 回调:当客户端连接时 /// public event Action OnClientConnected; /// /// 回调:当客户端断开连接时 /// public event Action OnClientDisconnected; /// /// 开启服务端的回调 /// public event Action OnStartServer; /// /// 关闭服务端的回调 /// public event Action OnStopServer; /// /// 运行服务端 /// /// 端口,默认为27014 void StartServer(ushort port = 27014); /// /// 停止服务端 /// /// 可选参数:强行释放,默认为false void StopServer(bool dispose=false); /// /// (只读)服务器是否正在运行 /// bool IsRunningServer { get; } /// /// 向单个链接发送消息 /// /// /// void SendMessageToClient(int id, string message); /// /// 向全部链接发送消息 /// /// void SendMessageToAll(string message); /// /// 所有已连接的客户端 /// public IDictionary Connections { get; } /// /// 添加远程命令监听,包括客户端Id /// /// /// void AddCommandListenerWithId(Action handle); /// /// 踢出客户端 /// /// void KickClient(int id); } /// /// 基本网络客户端的接口定义,包括了基本客户端的功能 /// ⭐基本客户端回调 /// ⭐是否已连接到服务器 /// ⭐连接服务端的延迟 /// ⭐客户端Id /// ⭐开启客户端 /// ⭐关闭客户端 /// public interface INetClient { /// /// 通讯接口 /// public INetProvider NetProvider=>this as INetProvider; /// /// 源物体,用于通过代理直接访问 /// public object Source => this; //基本客户端回调 public event Action OnStartConnect; public event Action OnConnected; public event Action OnDisconnected; public event Action OnConnectedFailed; /// /// 是否已连接到服务端 /// bool IsConnected { get; } /// /// 手动Tick /// bool ManualTick { get; set; } /// /// 连接服务端的延迟 /// int Ping { get; } /// /// 客户端Id /// int Id { get; } /// /// 断开链接 /// void Disconnect(); /// /// 异步开始链接 /// /// 服务端地址 /// 端口 /// UniTask Connect(string address = "localhost", ushort port = 27014); /// /// 向服务端发送消息 /// /// 消息 void SendServerMessage(string message); } }