public override bool DoTask(GameServer gameServer, IProtocol message) { if (gameServer == null || message == null) { throw new ArgumentException("gameServer & message can not be null."); } if (_taskState == TaskState.Processing) { FSEyeResult result; switch (message.ProtocolId) { case (UInt16)ProtocolDef.g2e_openfile_def: result = (FSEyeResult)((g2e_openfile)message).nRetCode; if (result == FSEyeResult.fseye_success) { if (_fileStream == null) { try { if (_fileDownloadAutomation != null) { //如果有Automation关联的话,则给下载文件的名字加前缀。 string fileName = SystemConfig.Current.AdminServerUploadFileRootPath + gameServer.Id + "_" + gameServer.Name + "_" + _targetFileName; _fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read); } else { _fileStream = new FileStream(SystemConfig.Current.AdminServerUploadFileRootPath + _targetFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read); } } catch (Exception) { if (_fileDownloadAutomation != null) { _fileDownloadAutomation.FinishUnit(gameServer, false); } return(false); } } //得到文件长度 _fileTotalLength = ((g2e_openfile)message).nFileLen; if ((uint)_fileStream.Length > _fileTotalLength) { //错误 现有文件长度大于源文件 覆盖现有文件 _fileStream.SetLength(0); _offset = 0; } if (_overWrite) { //覆盖 _fileStream.SetLength(0); _offset = 0; } else { //续传 if (_fileStream.Length == _fileTotalLength) { //文件已经存在且完成 KProtocolHead protocol = new KProtocolHead(); protocol.ProtocolId = (ushort)ProtocolDef.e2g_closefile_def; gameServer.SendMessage(protocol); return(true); } else { _offset = (uint)_fileStream.Length; _fileStream.Position = _fileStream.Length; } } e2g_seekfile seekfile = new e2g_seekfile(); seekfile.bKeep = 1; seekfile.nOffset = _offset; //TODO 没有处理发包失败的情况 gameServer.SendMessage(seekfile); return(true); } else { //文件不存在?! Stop(gameServer); if (_fileDownloadAutomation != null) { _fileDownloadAutomation.FinishUnit(gameServer, false); } return(false); } case (UInt16)ProtocolDef.g2e_seekfile_def: result = (FSEyeResult)((g2e_seekfile)message).nRetCode; if (result == FSEyeResult.fseye_success) { e2g_readfile protocol = new e2g_readfile(); protocol.nDataLen = 4000; gameServer.SendMessage(protocol); return(true); } else { //FSEyeResult.filetran_seek_err //还有其他未知的错误 Stop(gameServer); if (_fileDownloadAutomation != null) { _fileDownloadAutomation.FinishUnit(gameServer, false); } return(false); } case (UInt16)ProtocolDef.g2e_readfile_def: result = (FSEyeResult)((g2e_readfile)message).nRetCode; if (result == FSEyeResult.fseye_success) { g2e_readfile receivedProtocol = message as g2e_readfile; _fileStream.Write(receivedProtocol.szBuf, 0, (int)receivedProtocol.szBuf.Length); _offset += (uint)receivedProtocol.szBuf.Length; CompletePercentage = (float)_fileStream.Length / (float)_fileTotalLength; if (CompletePercentage < 1) { if (_offset != _fileStream.Length) { //Guard端读文件偏移和本地写文件的偏移不同 e2g_seekfile seekProtocol = new e2g_seekfile(); seekProtocol.nOffset = (uint)_fileStream.Length; gameServer.SendMessage(seekProtocol); } else { e2g_readfile readProtocol = new e2g_readfile(); readProtocol.nDataLen = 4000; gameServer.SendMessage(readProtocol); } } else { KProtocolHead protocol = new KProtocolHead(); protocol.ProtocolId = (ushort)ProtocolDef.e2g_closefile_def; //TODO 没有处理发包失败的情况 gameServer.SendMessage(protocol); } return(true); } else { Stop(gameServer); if (_fileDownloadAutomation != null) { _fileDownloadAutomation.FinishUnit(gameServer, false); } return(false); } case (UInt16)ProtocolDef.g2e_closefile_def: result = (FSEyeResult)((g2e_closefile)message).nRetCode; if (result == FSEyeResult.fseye_success) { //TODO 添加关闭成功代码 Complete(gameServer); return(true); } else { if (_fileDownloadAutomation != null) { _fileDownloadAutomation.FinishUnit(gameServer, false); } return(false); } default: break; } } else if (_taskState == TaskState.Aborting) { if (message.ProtocolId == (UInt16)ProtocolDef.g2e_closefile_def) { _taskState = TaskState.Stopped; } return(true); } return(false); }
/// <summary> /// 分发消息 /// </summary> /// <param name="msgBuff">消息</param> private void Dispatch(GameServer server, byte[] msgBuff) { if (server == null || msgBuff == null) { return; } if (msgBuff.Length <= 2) { return; } ProtocolDef protocalId = (ProtocolDef)BitConverter.ToUInt16(msgBuff, 0); IProtocol message = null; switch (protocalId) { #region 文件管理 case ProtocolDef.g2e_openfile_def: //打开文件 message = new g2e_openfile(); message.FromBytes(msgBuff); break; case ProtocolDef.g2e_seekfile_def: //移动到文件中的位置 message = new g2e_seekfile(); break; case ProtocolDef.g2e_writefile_def: //写入文件 message = new g2e_writefile(); break; case ProtocolDef.g2e_closefile_def: //关闭文件 message = new g2e_closefile(); break; case ProtocolDef.g2e_readfile_def: //读文件 message = new g2e_readfile(); break; #endregion #region 游戏服务器信息 case ProtocolDef.g2e_getcpubaseinfo_def: //取得CPU基本信息 message = new g2e_getcpubaseinfo(); break; case ProtocolDef.g2e_getcpuload_def: //取得CPU负载 message = new g2e_getcpuload(); break; case ProtocolDef.g2e_getdiskinfo_def: //取得磁盘信息 message = new g2e_getdiskinfo(); break; case ProtocolDef.g2e_getmeminfo_def: //取得内存信息 message = new g2e_getmeminfo(); break; case ProtocolDef.g2e_getprocinfo_def: //取得进程信息 message = new g2e_getprocinfo(); break; case ProtocolDef.g2e_getcardload_def: //取得网卡负载 message = new g2e_getcardload(); break; case ProtocolDef.g2e_getnetinfo_def: //取得网卡信息 message = new g2e_getnetinfo(); break; case ProtocolDef.g2e_getpluginfo_def: //取得插件信息 message = new g2e_getpluginfo(); break; #endregion #region 其他 case ProtocolDef.g2e_ping_def: //Ping message = new KProtocolHead(); break; case ProtocolDef.g2e_exesql_def: message = new g2e_exesql(); break; case ProtocolDef.g2e_exesyscmd_def: message = new g2e_exesyscmd(); break; case ProtocolDef.g2e_GetGuardDir_def: message = new g2e_GetGuardDir(); break; case ProtocolDef.g2e_switchmode_def: message = new KProtocolHead(); break; case ProtocolDef.g2e_config_def: message = new KProtocolHead(); break; case ProtocolDef.g2e_updateserver_def: message = new g2e_updateserver(); break; case ProtocolDef.g2e_ftpdownload_def: message = new g2e_ftpdownload(); break; case ProtocolDef.g2e_serverpid_def: message = new g2e_server_pid(); break; #endregion #region 与游戏的通讯 case ProtocolDef.l2e_header_def: { if (msgBuff.Length <= 4) { return; } ProtocolDef subProtocolId = (ProtocolDef)BitConverter.ToUInt16(msgBuff, 4); switch (subProtocolId) { // ahpho case ProtocolDef.l2e_update_custom_info_def: message = new l2e_update_custom_info(); break; case ProtocolDef.l2e_PlayerCount_def: message = new l2e_PlayerCount(); break; case ProtocolDef.l2e_ExeGMCmd_def: message = new l2e_ExeGMCmd(); break; case ProtocolDef.l2e_GetBasicInfo_def: message = new l2e_GetBasicInfo(); break; case ProtocolDef.l2e_Who_def: message = new l2e_Who(); break; case ProtocolDef.l2e_GetGlobalVariable_def: message = new l2e_GetGlobalVariable(); break; case ProtocolDef.l2e_GetGameStartTime_def: message = new l2e_GetGameStartTime(); break; case ProtocolDef.l2e_ReportError_def: message = new l2e_ReportError(); break; case ProtocolDef.l2e_info_def: message = new l2e_info(); break; case ProtocolDef.l2e_info_large_def: message = new l2e_info_large(); break; case ProtocolDef.l2e_ping_def: message = new KSubProtocolHead(); break; default: throw new Exception("收到未在MessageEngine中注册的协议包"); } } break; #endregion default: //TODO 记录没有出现过的协议包,开发阶段抛出异常 throw new Exception("收到未在MessageEngine中注册的协议包"); } if (server != null && message != null) { message.FromBytes(msgBuff); AdminServer.TheInstance.GameServerManager.ProcessMessage(server, message); } }
/// <summary> /// 分发消息 /// </summary> /// <param name="msgBuff">消息</param> private void Dispatch(GameServer server, byte[] msgBuff) { if (server == null || msgBuff == null) return; if (msgBuff.Length <= 2) { return; } ProtocolDef protocalId = (ProtocolDef)BitConverter.ToUInt16(msgBuff, 0); IProtocol message = null; switch (protocalId) { #region 文件管理 case ProtocolDef.g2e_openfile_def://打开文件 message = new g2e_openfile(); message.FromBytes(msgBuff); break; case ProtocolDef.g2e_seekfile_def://移动到文件中的位置 message = new g2e_seekfile(); break; case ProtocolDef.g2e_writefile_def://写入文件 message = new g2e_writefile(); break; case ProtocolDef.g2e_closefile_def://关闭文件 message = new g2e_closefile(); break; case ProtocolDef.g2e_readfile_def: //读文件 message = new g2e_readfile(); break; #endregion #region 游戏服务器信息 case ProtocolDef.g2e_getcpubaseinfo_def://取得CPU基本信息 message = new g2e_getcpubaseinfo(); break; case ProtocolDef.g2e_getcpuload_def://取得CPU负载 message = new g2e_getcpuload(); break; case ProtocolDef.g2e_getdiskinfo_def://取得磁盘信息 message = new g2e_getdiskinfo(); break; case ProtocolDef.g2e_getmeminfo_def://取得内存信息 message = new g2e_getmeminfo(); break; case ProtocolDef.g2e_getprocinfo_def://取得进程信息 message = new g2e_getprocinfo(); break; case ProtocolDef.g2e_getcardload_def://取得网卡负载 message = new g2e_getcardload(); break; case ProtocolDef.g2e_getnetinfo_def://取得网卡信息 message = new g2e_getnetinfo(); break; case ProtocolDef.g2e_getpluginfo_def://取得插件信息 message = new g2e_getpluginfo(); break; #endregion #region 其他 case ProtocolDef.g2e_ping_def://Ping message = new KProtocolHead(); break; case ProtocolDef.g2e_exesql_def: message = new g2e_exesql(); break; case ProtocolDef.g2e_exesyscmd_def: message = new g2e_exesyscmd(); break; case ProtocolDef.g2e_GetGuardDir_def: message = new g2e_GetGuardDir(); break; case ProtocolDef.g2e_switchmode_def: message = new KProtocolHead(); break; case ProtocolDef.g2e_config_def: message = new KProtocolHead(); break; case ProtocolDef.g2e_updateserver_def: message = new g2e_updateserver(); break; case ProtocolDef.g2e_ftpdownload_def: message = new g2e_ftpdownload(); break; case ProtocolDef.g2e_serverpid_def: message = new g2e_server_pid(); break; #endregion #region 与游戏的通讯 case ProtocolDef.l2e_header_def: { if (msgBuff.Length <= 4) return; ProtocolDef subProtocolId = (ProtocolDef)BitConverter.ToUInt16(msgBuff, 4); switch (subProtocolId) { // ahpho case ProtocolDef.l2e_update_custom_info_def: message = new l2e_update_custom_info(); break; case ProtocolDef.l2e_PlayerCount_def: message = new l2e_PlayerCount(); break; case ProtocolDef.l2e_ExeGMCmd_def: message = new l2e_ExeGMCmd(); break; case ProtocolDef.l2e_GetBasicInfo_def: message = new l2e_GetBasicInfo(); break; case ProtocolDef.l2e_Who_def: message = new l2e_Who(); break; case ProtocolDef.l2e_GetGlobalVariable_def: message = new l2e_GetGlobalVariable(); break; case ProtocolDef.l2e_GetGameStartTime_def: message = new l2e_GetGameStartTime(); break; case ProtocolDef.l2e_ReportError_def: message = new l2e_ReportError(); break; case ProtocolDef.l2e_info_def: message = new l2e_info(); break; case ProtocolDef.l2e_info_large_def: message = new l2e_info_large(); break; case ProtocolDef.l2e_ping_def: message = new KSubProtocolHead(); break; default: throw new Exception("收到未在MessageEngine中注册的协议包"); } } break; #endregion default: //TODO 记录没有出现过的协议包,开发阶段抛出异常 throw new Exception("收到未在MessageEngine中注册的协议包"); } if (server != null && message != null) { message.FromBytes(msgBuff); AdminServer.TheInstance.GameServerManager.ProcessMessage(server, message); } }