336 lines
10 KiB
C#
336 lines
10 KiB
C#
/*
|
||
* 该接口为基础的网络接口,包括了网络服务,服务端接口,客户端接口的基本定义 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;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 帮助类
|
||
/// </summary>
|
||
public static class NetUtils
|
||
{
|
||
/// <summary>
|
||
/// 计算文件大小函数(保留两位小数),Size为字节大小
|
||
/// </summary>
|
||
/// <param name="size">初始文件大小</param>
|
||
/// <returns></returns>
|
||
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
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 网络指令类型
|
||
/// </summary>
|
||
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,
|
||
}
|
||
/// <summary>
|
||
/// 网络提供服务,包括了基础网络服务,e.g
|
||
/// ⭐向服务器发送指令
|
||
/// ⭐向所有客户端发送指令
|
||
/// ⭐向单个客户端发送指令
|
||
/// ⭐监听与取消监听网络命令
|
||
/// ⭐从服务器获取数据
|
||
/// ⭐从客户端获取数据
|
||
/// ⭐添加Rpc处理服务
|
||
/// ⭐向服务器发送Rpc
|
||
/// ⭐向所有客户端发送Rpc
|
||
/// </summary>
|
||
public interface INetProvider
|
||
{
|
||
/// <summary>
|
||
/// 向服务端发送指令
|
||
/// </summary>
|
||
/// <typeparam name="T">远程指令类型</typeparam>
|
||
void ServerCommand<T>(T command = default);
|
||
|
||
/// <summary>
|
||
/// 向所有客户端发送指令
|
||
/// </summary>
|
||
/// <typeparam name="T">远程指令类型</typeparam>
|
||
void AllClientCommand<T>(T command = default);
|
||
/// <summary>
|
||
/// 向单个客户端发送指令
|
||
/// </summary>
|
||
/// <param name="id">客户端ID</param>
|
||
/// <param name="command">指令实例</param>
|
||
/// <typeparam name="T">远程指令类型</typeparam>
|
||
void ClientCommand<T>(int id, T command);
|
||
|
||
/// <summary>
|
||
/// 从服务端获取数据
|
||
/// </summary>
|
||
/// <typeparam name="T"></typeparam>
|
||
/// <returns></returns>
|
||
UniTask<T> GetFromServer<T>(string path = null,params object[] pars);
|
||
|
||
/// <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 path = null,params object[] pars);
|
||
|
||
/// <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>
|
||
/// 监听远程func
|
||
/// </summary>
|
||
/// <param name="func"></param>
|
||
/// <typeparam name="T"></typeparam>
|
||
void AddCommandListener<T>(Func<T,UniTask<T>> func);
|
||
|
||
/// <summary>
|
||
/// 取消监听远程指令
|
||
/// </summary>
|
||
/// <param name="handle">远程指令回调</param>
|
||
/// <typeparam name="T">远程指令类型</typeparam>
|
||
void RemoveCommandListener<T>(Func<T,UniTask<T>> func);
|
||
|
||
/// <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);
|
||
/// <summary>
|
||
/// 更新Tick
|
||
/// </summary>
|
||
void Tick();
|
||
/// <summary>
|
||
/// 连接协议握手
|
||
/// </summary>
|
||
void HandShake();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 服务端接口,支持服务端的基本功能
|
||
/// ⭐开启服务器(支持指定端口)
|
||
/// ⭐停止服务器
|
||
/// ⭐服务器运行状态
|
||
/// </summary>
|
||
public interface INetServer
|
||
{
|
||
/// <summary>
|
||
/// 通信接口
|
||
/// </summary>
|
||
public INetProvider NetProvider=>this as INetProvider;
|
||
/// <summary>
|
||
/// 源物体,用于通过代理直接访问
|
||
/// </summary>
|
||
public object Source => this;
|
||
/// <summary>
|
||
/// 手动Tick
|
||
/// </summary>
|
||
public bool ManualTick { get; set; }
|
||
/// <summary>
|
||
/// 回调:当客户端连接时
|
||
/// </summary>
|
||
public event Action<int> OnClientConnected;
|
||
|
||
/// <summary>
|
||
/// 回调:当客户端断开连接时
|
||
/// </summary>
|
||
public event Action<int> OnClientDisconnected;
|
||
/// <summary>
|
||
/// 开启服务端的回调
|
||
/// </summary>
|
||
public event Action OnStartServer;
|
||
/// <summary>
|
||
/// 关闭服务端的回调
|
||
/// </summary>
|
||
public event Action OnStopServer;
|
||
|
||
/// <summary>
|
||
/// 运行服务端
|
||
/// </summary>
|
||
/// <param name="port">端口,默认为27014</param>
|
||
void StartServer(ushort port = 27014);
|
||
|
||
/// <summary>
|
||
/// 停止服务端
|
||
/// </summary>
|
||
/// <param name="dispose">可选参数:强行释放,默认为false</param>
|
||
void StopServer(bool dispose=false);
|
||
|
||
/// <summary>
|
||
/// (只读)服务器是否正在运行
|
||
/// </summary>
|
||
bool IsRunningServer { get; }
|
||
|
||
/// <summary>
|
||
/// 向单个链接发送消息
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <param name="message"></param>
|
||
void SendMessageToClient(int id, string message);
|
||
/// <summary>
|
||
/// 向全部链接发送消息
|
||
/// </summary>
|
||
/// <param name="message"></param>
|
||
void SendMessageToAll(string message);
|
||
/// <summary>
|
||
/// 所有已连接的客户端
|
||
/// </summary>
|
||
public IDictionary<int,EndPoint> Connections { get; }
|
||
|
||
/// <summary>
|
||
/// 添加远程命令监听,包括客户端Id
|
||
/// </summary>
|
||
/// <param name="handle"></param>
|
||
/// <typeparam name="T"></typeparam>
|
||
void AddCommandListenerWithId<T>(Action<int,T> handle);
|
||
/// <summary>
|
||
/// 踢出客户端
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
void KickClient(int id);
|
||
}
|
||
/// <summary>
|
||
/// 基本网络客户端的接口定义,包括了基本客户端的功能
|
||
/// ⭐基本客户端回调
|
||
/// ⭐是否已连接到服务器
|
||
/// ⭐连接服务端的延迟
|
||
/// ⭐客户端Id
|
||
/// ⭐开启客户端
|
||
/// ⭐关闭客户端
|
||
/// </summary>
|
||
public interface INetClient
|
||
{
|
||
/// <summary>
|
||
/// 通讯接口
|
||
/// </summary>
|
||
public INetProvider NetProvider=>this as INetProvider;
|
||
/// <summary>
|
||
/// 源物体,用于通过代理直接访问
|
||
/// </summary>
|
||
public object Source => this;
|
||
|
||
//基本客户端回调
|
||
public event Action OnStartConnect;
|
||
public event Action OnConnected;
|
||
public event Action OnDisconnected;
|
||
public event Action OnConnectedFailed;
|
||
/// <summary>
|
||
/// 是否已连接到服务端
|
||
/// </summary>
|
||
bool IsConnected { get; }
|
||
/// <summary>
|
||
/// 手动Tick
|
||
/// </summary>
|
||
bool ManualTick { get; set; }
|
||
/// <summary>
|
||
/// 连接服务端的延迟
|
||
/// </summary>
|
||
int Ping { get; }
|
||
/// <summary>
|
||
/// 客户端Id
|
||
/// </summary>
|
||
int Id { get; }
|
||
/// <summary>
|
||
/// 断开链接
|
||
/// </summary>
|
||
void Disconnect();
|
||
/// <summary>
|
||
/// 异步开始链接
|
||
/// </summary>
|
||
/// <param name="address">服务端地址</param>
|
||
/// <param name="port">端口</param>
|
||
/// <returns></returns>
|
||
UniTask<bool> Connect(string address = "localhost", ushort port = 27014);
|
||
|
||
/// <summary>
|
||
/// 向服务端发送消息
|
||
/// </summary>
|
||
/// <param name="message">消息</param>
|
||
void SendServerMessage(string message);
|
||
}
|
||
}
|