跳到主要内容
版本:v3

NetFrames

重要 注意 提醒

Coding Style wiki


NetFramesNetFrame 模块的统一调用入口(Facade),以节点(NetNode)为单位管理多组网络连接。每个节点可搭配独立的传输实现(INetProvider)与连接选项(NetOption),涵盖节点注册、连接、发送数据与关闭,并提供驱动网络轮询的更新器控制。

命名空间OxGFrame.NetFrame
类型public static class
源码NetFrames.cs
using OxGFrame.NetFrame;

注意 调用连接相关 API 前,需先自行创建 NetNode 并通过 AddNetNode 注册至管理器,完整搭建流程请参考 NetFrame 介绍

快速上手

// 创建网络节点(使用内置 TCP Provider;NetTipsExample 为自定义的 INetTips 实现)
var netNode = new NetNode(new TcpNetProvider(), new NetTipsExample());
netNode.SetResponseBinaryHandler(recvData => Debug.Log($"接收到 {recvData.Length} bytes"));

// 注册节点(单一连接使用默认 nnId = 0 即可)
NetFrames.AddNetNode(netNode);

// 连接至服务器
NetFrames.Connect(new TcpNetOption("127.0.0.1", 8888));

// 发送二进制数据
NetFrames.Send(new byte[] { 0x01, 0x02 });

// 关闭连接并移除节点
NetFrames.Close(0, removeNetNode: true);

通用规则

多节点管理 (nnId)

NetFrame 以节点(NetNode)为单位组织网络连接,每个节点拥有各自独立的传输实现(INetProvider)、连接选项(NetOption)与状态提示(INetTips),并以 nnId(Node ID)作为唯一标识码进行管理,所有操作方法皆以 nnId 指定目标节点。

注意 大多数单一连接的场景,直接使用默认的 nnId = 0 即可;若需同时连接多个服务器(如 Login Server 与 Game Server),请为各节点分配独立的 nnId

提醒 NetNode 本身还支持心跳、超时检测与重连等回调设置(SetHeartBeatActionSetOutReceiveActionSetReconnectAction 等),详细搭建流程请参考 NetFrame 介绍

内置 Provider

内置三种 INetProvider 实现,连接时搭配对应的 NetOption 派生类使用;也可自行实现 INetProvider 扩展其他传输协议。

Provider底层库对应 NetOption字符串发送
TcpNetProviderTelepathyTcpNetOption不支持
KcpNetProviderkcp2kKcpNetOption不支持
WebSocketNetProviderUnityWebSocketWebSocketNetOption支持

注意 TcpNetProviderKcpNetProvider 仅支持二进制发送,对其调用字符串重载的 Send 会抛出异常。

更新器 (Updater)

NetManager 使用独立的 RTUpdaterReal-time Updater)驱动所有节点的轮询逻辑(数据接收、心跳、超时与重连计时)。首次调用任一 NetFrames API 时,管理器会自动初始化并在主线程启动更新器。

提醒 RTUpdater 为实时刷新器,不受 Unity Time.timeScale 影响,即使游戏暂停,网络通信依然正常运作。

重要 若通过 StartUpdaterOnThreadResetUpdaterOnThread 改以独立线程驱动,所有网络回调(如 Binary 接收回调)会在非主线程触发,若需操作 Unity 组件,请务必注意线程安全并使用 UMT 调度回主线程。


节点管理

节点的注册、获取与移除。NetNode 需以 new NetNode(INetProvider, INetTips) 自行创建后注册至管理器(参考多节点管理)。

方法总览

初始化

方法说明
InitInstance初始化 NetManager 单例实例。

节点注册与获取

方法说明
AddNetNode注册网络节点至管理器。
RemoveNetNode释放并移除指定节点。
GetNetNode获取已注册的网络节点。
Count获取已注册的节点总数。

InitInstance

public static void InitInstance()

说明

主动初始化 NetManager 单例实例,初始化时会一并创建更新器并在主线程启动。建议在游戏启动阶段调用一次,确保管理器提前就绪。

提醒 所有 NetFrames API 在首次调用时皆会自动完成初始化,此方法仅用于提前初始化。


AddNetNode

public static void AddNetNode(NetNode netNode, int nnId = 0)

参数

参数类型说明
netNodeNetNode要注册的网络节点实例。
nnIdint节点的唯一标识码。
默认值0

说明

将网络节点注册至管理器,之后即可通过 nnId 对该节点进行连接、发送与关闭等操作。

注意nnId 已存在,旧节点会先被 Dispose(关闭连接并释放资源),再以新节点取代。

示例

public enum NNID
{
WebSocket = 0,
TCP = 1,
KCP = 2
}

// 注册 WebSocket 节点
var wsNode = new NetNode(new WebSocketNetProvider(), new NetTipsExample());
NetFrames.AddNetNode(wsNode, (int)NNID.WebSocket);

// 注册 TCP 节点
var tcpNode = new NetNode(new TcpNetProvider(), new NetTipsExample());
NetFrames.AddNetNode(tcpNode, (int)NNID.TCP);

RemoveNetNode

public static void RemoveNetNode(int nnId = 0)

参数

参数类型说明
nnIdint节点的唯一标识码。
默认值0

说明

将指定节点从管理器移除,移除前会先 Dispose 该节点(关闭连接并释放回调与计时器等资源)。未找到节点时不动作。


GetNetNode

public static NetNode GetNetNode(int nnId = 0)

参数

参数类型说明
nnIdint节点的唯一标识码。
默认值0

返回值

NetNode — 已注册的节点实例;未找到时返回 null

说明

获取已注册的网络节点,可对节点进行高级设置(如心跳、超时、重连回调),或通过 GetNetProvider<T>() 获取底层 Provider 进行高级操作。

示例

// 检查节点是否已注册
if (NetFrames.GetNetNode() == null)
{
// 尚未注册,先行创建节点
}

// 获取底层 Provider,改以 KCP Unreliable 通道发送
NetFrames.GetNetNode((int)NNID.KCP)
.GetNetProvider<KcpNetProvider>()
.SendBinary(kcp2k.KcpChannel.Unreliable, buffer);

Count

public static int Count()

返回值

int — 当前已注册的网络节点总数。

说明

获取管理器中已注册的节点数量。


连接与通信

针对指定节点执行连接、发送与关闭等网络操作。

方法总览

连接

方法说明
Connect开启指定节点的连接。
IsConnected检查指定节点的连接状态。

发送与关闭

方法说明
Send通过指定节点发送二进制或字符串数据。
Close断开指定节点的连接。
CloseAll断开所有节点的连接。

Connect

public static void Connect(NetOption netOption, int nnId = 0)

参数

参数类型说明
netOptionNetOption连接选项。依节点的 Provider 传入对应的派生类(如 TcpNetOptionKcpNetOptionWebSocketNetOption)。
nnIdint目标节点的唯一标识码。
默认值0

说明

开启指定节点的连接。连接流程启动时会触发 INetTips.OnConnecting 与节点的 Connecting 回调;连接成功后触发 INetTips.OnConnected 与 Connected 回调。未找到节点时输出错误日志。

注意
  • netOption 的类型必须与节点的 Provider 相对应,实现内部会将其转换以获取连接参数。
  • 节点仅在未连接DISCONNECTED)或重连中RECONNECTING)状态下才会启动连接流程,重复调用不会建立第二条连接。

示例

// TCP 连接(断线后自动重连 3 次)
NetFrames.Connect(new TcpNetOption("127.0.0.1", 8888, autoReconnectCount: 3), (int)NNID.TCP);

// WebSocket 连接
NetFrames.Connect(new WebSocketNetOption("ws://127.0.0.1:8080/ws"), (int)NNID.WebSocket);

IsConnected

public static bool IsConnected(int nnId = 0)

参数

参数类型说明
nnIdint目标节点的唯一标识码。
默认值0

返回值

bool — 节点已连接返回 true;未找到节点或未连接返回 false

说明

检查指定节点底层 Provider 的连接状态。


Send

public static bool Send(byte[] buffer, int nnId = 0)
public static bool Send(string text, int nnId = 0)

参数

参数类型说明
bufferbyte[]要发送的二进制数据。
textstring要发送的字符串数据。
nnIdint目标节点的唯一标识码。
默认值0

返回值

bool — 成功交付底层 Provider 发送返回 true;未找到节点或未连接时返回 false

说明

通过指定节点发送数据。二进制重载对应 Provider 的 SendBinary;字符串重载对应 SendMessage

重要 内置的 TcpNetProviderKcpNetProvider 不支持字符串发送,调用字符串重载会抛出异常;仅 WebSocketNetProvider 支持。

示例

// 发送二进制数据
bool sent = NetFrames.Send(new byte[] { 0x01, 0x02, 0x03 });

// 发送字符串数据(仅 WebSocket 支持)
NetFrames.Send("{\"cmd\":\"ping\"}", (int)NNID.WebSocket);

Close

public static void Close(int nnId = 0, bool removeNetNode = false)

参数

参数类型说明
nnIdint目标节点的唯一标识码。
默认值0
removeNetNodebool关闭后是否一并将节点从管理器移除(Dispose)。
默认值false

说明

断开指定节点的连接。主动关闭属于强制关闭,不会触发自动重连;若 removeNetNodefalse,节点仍保留在管理器中,可再次调用 Connect 重新连接。未找到节点时不动作。

示例

// 仅关闭连接(节点保留,可重新连接)
NetFrames.Close();

// 关闭连接并移除节点
NetFrames.Close((int)NNID.TCP, true);

CloseAll

public static void CloseAll(bool removeNetNode = false)

参数

参数类型说明
removeNetNodebool关闭后是否一并移除所有节点。
默认值false

说明

断开所有已注册节点的连接,参数行为同 Close。适用于登出或退出游戏时的统一清理。


更新器控制

控制 NetManager 更新器的启停、重置与运作速率,更新器概念与线程注意事项请参考更新器 (Updater)

方法总览

启动与停止

方法说明
StartUpdater在主线程启动更新器。
StartUpdaterOnThread在独立线程启动更新器。
StopUpdater停止更新器。
IsUpdaterRunning检查更新器是否运行中。

重置与调速

方法说明
ResetUpdater重置并重启更新器。
ResetUpdaterOnThread重置并在独立线程重启更新器。
SetUpdaterTimeScale调整更新器的时间缩放倍率。

StartUpdater

public static void StartUpdater()

说明

主线程启动更新器。管理器初始化时默认即以主线程模式启动,通常仅在调用过 StopUpdater 后需要手动重启。


StartUpdaterOnThread

public static void StartUpdaterOnThread()

说明

独立线程启动更新器,适用于避免主线程阻塞或需要更实时轮询的场景。

重要 线程模式下,所有网络回调会在非主线程触发,操作 Unity 组件请务必注意线程安全(参考更新器 (Updater))。


StopUpdater

public static void StopUpdater()

说明

停止更新器,所有节点的轮询逻辑(数据接收、心跳、超时与重连计时)将一并暂停,直到再次启动。


IsUpdaterRunning

public static bool IsUpdaterRunning()

返回值

bool — 更新器运行中返回 true

说明

检查 NetManager 更新器当前是否正在运行。


ResetUpdater

public static void ResetUpdater()
public static void ResetUpdater(bool useThreadedUpdater)

参数

参数类型说明
useThreadedUpdaterbool是否改以独立线程模式重启。true = 独立线程;false = 主线程。无参数重载等同传入 false

说明

停止并销毁现有更新器后,重新创建并依指定模式启动。可用于切换线程模式或重置更新器状态。


ResetUpdaterOnThread

public static void ResetUpdaterOnThread()

说明

重置更新器并改以独立线程模式重启,等同调用 ResetUpdater(true)


SetUpdaterTimeScale

public static void SetUpdaterTimeScale(float timeScale)

参数

参数类型说明
timeScalefloat时间缩放倍率。

说明

设置 NetManager 更新器的时间缩放倍率(RTUpdater.timeScale)。