Tcp连接依赖Gamebox中的Network服务和字节流预分配,在初始化注册服务时便已完成该操作.
public TcpConnection()
{
GameWorld.Instance.OnApplicationQuit(Disconnect);
new ServiceTask(new[]
{
typeof(IByteStorage),
typeof(INetworkManager)
}).Start().Continue(t =>
{
_iNetworkManager = ServiceCenter.GetService<INetworkManager>();
return null;
});
}
通过Http连接,会获得游戏服务器地址和房间key.首先开始Tcp协议的Socket连接返回的地址.如果连接成功会:
- 开始心跳包,检测客户端和服务器一直保持连接.
- 主动发送房间登录消息(携带房间key).
TcpConnection.cs:
private void OnServerStateChange(string state)
{
switch (state)
{
case Connected:
Debuger.Log("OnTeamServerState" + Connected);
ServerConnected();
break;
case Connecting:
Debuger.Log("OnTeamServerState" + Connecting);
break;
case Disconnected:
var str = Singleton.GetInstance<Localization>().Get(ExcelManager.settings_error[1].error);
Service.UIManager.ShowPop(str);
Debuger.Log("OnTeamServerState" + Disconnected);
break;
}
}
private void ServerConnected()
{
heartBeatMsg = new HeartBeatMsg((int)MsgTypeCmd.HeartBeat);
new RoomLoginMsg((int)MsgTypeCmd.Login);
}
服务器返回战斗场景数据,开始战场数据处理,本地场景加载,战场UI加载等逻辑.
为优化移动逻辑,可以选择采用Tcp,Udp,Kcp协议处理移动消息:
MsgBindTCPSession msgBindTcpSession = new MsgBindTCPSession();
msgBindTcpSession.id = HttpAgent.ID;
msgBindTcpSession.key = HttpAgent.RoomServerkey;
if (Connection.ESocketType == Connection.ESocket.Kcp)
{
MsgHandler.Send_Kcp((int)MsgTypeCmd.BindTCPSession, msgBindTcpSession);
}
else if (Connection.ESocketType == Connection.ESocket.Udp)
{
MsgHandler.Send_Udp((int)MsgTypeCmd.BindTCPSession, msgBindTcpSession);
}