保持连接活动状态
注意:Netcode for GameObjects (NGO) 会自动保持连接活动状态。请参阅搭配 NGO 使用 Relay。
在客户端处于无活动状态一段时间后,Relay 服务器会自动与客户端断开连接。Relay 断开与客户端连接前的默认生存时间 (TTL) 为 10 秒。主机处于独立状态时(BIND
消息后,但在对端使用 CONNECT
进行连接之前),断开连接前的 TTL 为 60 秒。Relay 服务器收到的关于客户端(作为发送方或接收方)的任何消息均会引发超时时间重置。
对于消息收发频率较低的游戏,有必要使用通常调用的 Update()
循环等方法,保持连接活动状态。如果搭配 NGO 使用 Relay,Network Manager (NetworkManager
) 会自动保持连接活动状态。不过,这仅在已成功调用 StartClient
或 StartHost
之后才能实现。
如果搭配 UTP 使用 Relay,只要对主机玩家和加入玩家的 NetworkDriver
定期计划更新,UTP 就可以自动保持连接活动状态。通常情况下,接受新的连接和接收消息也需要定期计划更新。以下代码示例展示了可保持连接活动状态的代码。
//Call the below regularly, e.g., in Monobehaviour.Update()
void Example_KeepingConnectionAlive()
{
// Update the NetworkDrivers regularly to ensure the host/player is kept online.
if (HostDriver.IsCreated && isRelayServerConnected)
{
HostDriver.ScheduleUpdate().Complete();
//Accept incoming client connections
while (HostDriver.Accept() != default(NetworkConnection))
{
Debug.Log("Accepted an incoming connection.");
}
}
if (PlayerDriver.IsCreated && clientConnection.IsCreated)
{
PlayerDriver.ScheduleUpdate().Complete();
//Resolve event queue
NetworkEvent.Type eventType;
while ((eventType = clientConnection.PopEvent(PlayerDriver, out _)) != NetworkEvent.Type.Empty)
{
if (eventType == NetworkEvent.Type.Connect)
{
Debug.Log("Client connected to the server");
}
else if (eventType == NetworkEvent.Type.Disconnect)
{
Debug.Log("Client got disconnected from server");
clientConnection = default(NetworkConnection);
}
}
}
}