/*
* 该接口为基础的网络接口,包括了网络服务,服务端接口,客户端接口的基本定义 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);
}
}