以下方法为了解决游戏访问过程中出现的域名问题和网络异常,根据传入的游戏当前使用的域名,会返回一个备用的域名或一组备用的 IP 地址列表,如果没有备用的域名/IP 地址,则返回结果为空。如果有备用的域名/IP 地址,游戏需要使用备用的域名/IP 地址重新发起网络请求,直到请求响应成功或者备用域名/IP 地址全部请求失败。通过这种方式,能够确保在网络请求错误发生时,仍然能够尝试通过其他域名/IP 地址来恢复游戏客户端与服务器的连接,从而提高系统的可靠性和稳定性。

游戏网络请求过程中出现错误的处理流程图如下图所示: Image

网络请求错误大致分为以下三类:

  • SSL证书错误: 通常是由于证书过期、证书验证、安全协议错误、主机名不匹配、证书链问题等原因引起的。在控制台中可能会看到类似“certificate has expired”或“unable to verify the first certificate”的错误信息。
  • 域名解析错误: 通常是由于 DNS 解析错误、DNS 服务器问题、域名过期或到期未续费、网络连接问题等原因引起的。在控制台中可能会看到类似“Unable to resolve host”或“DNS server not responding”的错误信息。
  • 其他网络错误: 通常是指除 SSL 证书错误和域名解析错误之外的其他错误类型。

以下游戏网络优化方法不需要完成 SDK 初始化,可在 SDK 初始化之前调用,例如可在热更新过程中遇到域名或网络问题时调用。游戏遇到网络错误时,调用以下方法时会触发 sdk_game_server_error 埋点。

1. SSL 证书错误

当出现 SSL 证书错误的时候调用该方法,会返回一组备用的 IP 地址列表,如果返回结果不为空,通过轮询机制将当前游戏域名中的 host 部分逐一替换为这些 IP 地址,并重新发起网络请求,直到成功收到网络响应或已经遍历了所有可用的 IP 地址。

[!NOTE|labelVisibility:hidden|iconVisibility:hidden] 错误示例:SSL handshake aborted: ssl=0x7b56b07f: I/O error during system call, Connection reset by peer

SFPlatform.getInstance().getGameServerIpWhenSSLError(gameServerDomain);

[!TIP|labelVisibility:hidden|iconVisibility:hidden] 示例:游戏客户端在遇到SSL证书错误时调用getGameServerIpWhenSSLError方法传入的gameServerDomainhttps://game-server.sofishgame.com,该方法返回了一组IP地址:192.168.1.1192.168.1.2192.168.1.3。将当前使用的游戏域名https://game-server.sofishgame.comhost部分替换为第一个IP地址192.168.1.1,并尝试重新建立连接。如果请求成功,则立即停止轮询并继续执行后续操作。如果第一个IP地址仍然无法建立连接(比如,由于SSL错误或其他网络问题),则自动切换到第二个IP地址192.168.1.2,并重复上述过程。如果经过多次尝试后,所有返回的IP地址都无法成功建立连接,游戏可以判定为所有IP地址请求失败,并采取相应的错误处理措施。

2. 域名解析错误

当出现域名解析错误的时候调用该方法,会返回一组备用的 IP 地址列表,如果返回结果不为空,通过轮询机制将当前游戏域名中的 host 部分逐一替换为这些 IP 地址,并重新发起网络请求,直到成功收到网络响应或已经遍历了所有可用的 IP 地址。

[!NOTE|labelVisibility:hidden|iconVisibility:hidden] 错误示例:Unable to resolve host "api.xx.com": No address associated with hostname

SFPlatform.getInstance().getGameServerIpWhenUnknownHost(gameServerDomain);

[!TIP|labelVisibility:hidden|iconVisibility:hidden] 示例:游戏客户端在遇到SSL证书错误时调用getGameServerIpWhenUnknownHost方法传入的gameServerDomainhttps://game-server.sofishgame.com,该方法返回了一组IP地址:192.168.1.1192.168.1.2192.168.1.3。将当前使用的游戏域名https://game-server.sofishgame.comhost部分替换为第一个IP地址192.168.1.1,并尝试重新建立连接。如果请求成功,则立即停止轮询并继续执行后续操作。如果第一个IP地址仍然无法建立连接(比如,由于域名解析错误或其他网络问题),则自动切换到第二个IP地址192.168.1.2,并重复上述过程。如果经过多次尝试后,所有返回的IP地址都无法成功建立连接,游戏可以判定为所有IP地址请求失败,并采取相应的错误处理措施。

3. 其他网络错误

当出现 SSL 证书错误和域名解析错误以外的其他网络错误的时候调用该方法,会返回一个指定域名之外的域名,如果返回结果不为空,则将当前使用的域名替换为返回的域名。建议重试 3 次失败后再调用此方法,超时时间建议设置为 5 秒。

SFPlatform.getInstance().getGameServerDomainWhenOtherError(gameServerDomain);

[!TIP|labelVisibility:hidden|iconVisibility:hidden] 示例:游戏客户端在遇到其他网络错误时调用getGameServerDomainWhenOtherError方法传入的gameServerDomainhttps://game-server.sofishgame.com,该方法返回的域名为game-server-cdn.sofishgame.com,则将当前使用的游戏域名替换为https://game-server-cdn.sofishgame.com继续发起网络请求,如果替换的域名连续失败3次之后,则将替换的域名作为游戏当前使用的域名,并重复上述过程。

4. 静态域名错误

当游戏中静态域名出现网络错误的时候(比如热更新)调用该方法,会返回一个指定域名之外的可用域名,并将当前使用的域名替换为返回的域名。建议重试 3 次失败后再调用此方法,超时时间建议设置为 5 秒。

SFPlatform.getInstance().getGameStaticDomainWhenError(gameStaticDomain);

[!TIP|labelVisibility:hidden|iconVisibility:hidden] 示例:游戏客户端在热更新时遇到网络请求错误,调用getGameStaticDomainWhenError方法传入的gameStaticDomainhttps://game-static.sofishgame.com,该方法返回的静态域名为https://game-static-cdn.sofishgame.com,则将当前使用的游戏静态域名替换为https://game-static-cdn.sofishgame.com继续发起网络请求,如果替换的域名失败3次之后,则将替换的域名作为游戏当前使用的静态域名,并重复上述过程。

results matching ""

    No results matching ""