客户端遇到网络不稳定断线时或者切换网络时,就要进行重连。注意断线重连和自动登录是两个步骤,这里我们先讲网络不稳定断线重连。切换网络和自动登录在后面补充。

普通断线重连

NetManager中添加m_IsDisconnected变量、m_IsFirstConnectedm_IsReconnect变量,第一个表示是否已经断线,第二个表示是否是第一次成功连接服务端,第三个表示是否是重连

1
2
3
4
5
6
//链接状态
private bool m_IsConnecting;
private bool m_IsClosing;
private bool m_IsDisconnected;//+++
private bool m_IsFirstConnected;//+++
private bool m_IsReconnect;//是否是重连,用于自动登录

NetManagerReallyClose方法中,将m_IsDisconnected变量设为true

1
2
3
4
5
6
7
8
9
void ReallyClose(bool normal = true)
{
SecretKey = "";
m_Socket.Close();
FirstEvent(NetEvent.Close, normal.ToString());
m_IsDisconnected = true;//+++
//...
Debug.Log("CloseSocket");
}

NetManager.ConnectCallback中,将m_IsFirstConnected变量设为true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
/// 链接回调
/// </summary>
/// <param name="ar">回调的状态</param>
void ConnectCallback(IAsyncResult ar)
{
try
{
Socket socket = (Socket)ar.AsyncState;
socket.EndConnect(ar);
FirstEvent(NetEvent.ConnectSucc, "");
m_IsFirstConnected = true;//+++
//...
}
catch (SocketException se)
{
//...
}
}

NetManager中添加ReConnect方法

1
2
3
4
5
6
7
8
/// <summary>
/// 重连到服务器
/// </summary>
public void ReConnect()
{
Connect(m_IP, m_Port);
m_IsReconnect = true;
}

NetManager.Update方法中添加重连逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Update()
{
if (m_IsDisconnected && m_IsFirstConnected)
{
//弹框,确定是否重连
//...
//重新连接
ReConnect();
//退出游戏
//...
m_IsDisconnected = false;
}
MsgUpdate();
}

注意ReConnect调用的是Connect,开启的是一个异步方法,所以在Update方法中调用了ReConnect();后紧接着m_IsDisconnected = false;我们不能在连接成功的回调(ConnectCallback)中将m_IsDisconnected = false;,那样的话在Update中会一直调用ReConnect方法

自动登录

在后面补充完数据库相关内容后,会添加断线重连自动登录的内容。

客户端断线重连自动登录

网络切换断线重连

当客户端网络切换时,需要重新连接服务器,我们每隔一秒对当前网络和上次网络进行判断,如果不同就进行重连。

NetManager中声明变量

1
private NetworkReachability m_CurNetwork = NetworkReachability.NotReachable;

然后声明一个协程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public IEnumerator CheckNet()
{
m_CurNetwork = Application.internetReachability;
while (true)
{
yield return new WaitForSeconds(1);
if (m_IsFirstConnected)
{
if(m_CurNetwork != Application.internetReachability)
{
ReConnect();
m_CurNetwork = Application.internetReachability;//这个地方不严谨
}
}
}
}

注意,ReConnect其实是一个异步方法,它后面的m_CurNetwork = Application.internetReachability;最好在回调方法内执行。否则如果这里重连失败,这个协程只能执行一次。(假设我们还是这么写,并且重连失败,会等到心跳包断开和服务器的连接,进行普通断线重连)

NetTest中开启协程

1
2
3
4
5
void Start()
{
NetManager.Instance.Connect("127.0.0.1", 8011);
StartCoroutine(NetManager.Instance.CheckNet());//+++
}