BITKit/Src/Core/Net/NetProvider.cs

336 lines
10 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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