private static void GameInfoMessageHandle(Protocol.MinuteFrameworkProtocol.Header header, byte[] msg) { switch ((Protocol.MinuteFrameworkProtocol.GameInfoType)header.optNumber) { case Protocol.MinuteFrameworkProtocol.GameInfoType.UserInfo: if (Connections.getInstance().ServerMode) { return; // 서버는 이것을 처리하지 않는다. } UserInfos ui = UserInfos.getInstance(); User user = Protocol.MinuteFrameworkProtocol.ParseUserPacket(msg, 0, msg.Length); // 없으면 등록하고 이미 존재하면 값을 교체한다. if (!ui.users.ContainsKey(user.Nickname)) { ui.users.TryAdd(user.Nickname, user); } else { ui.users[user.Nickname].UpdateData(user); } break; default: break; } }
/// <summary> /// 메세지를 수신하라고 알립니다. 해당 메세지는 동기식으로 수신됩니다. /// 수신된 데이터는 헤더와 내용으로 분리됩니다. /// </summary> /// <param name="target">통신 대상을 의미합니다.</param> /// <param name="header">헤더가 저장될 변수를 말합니다.</param> /// <returns>메세지의 본문을 의미합니다.</returns> public static byte[] Socket_MessageReceiveSync(CommunicateTarget target, out Protocol.MinuteFrameworkProtocol.Header header) { int index = 0; byte[] packet; target.msgReadedLength = 0; // Header를 받는 부분 while (target.msgReadedLength < Protocol.MinuteFrameworkProtocol.HEADER_SIZE) { target.msgReadedLength += target.socket.Receive( target.msgHeaderHolder, target.msgReadedLength, Protocol.MinuteFrameworkProtocol.HEADER_SIZE - target.msgReadedLength, 0); } header = Protocol.MinuteFrameworkProtocol.ParseHeader(ref target.msgHeaderHolder); // packet에 대한 내용을 기록하기 packet = new byte[header.size]; while (index < header.size) { index += target.socket.Receive(packet, index, (int)header.size - index, 0); } return(packet); }
// 시스템 메세지 분류 private static void GameSystemMessageHandle(Protocol.MinuteFrameworkProtocol.Header header, byte[] msg) { switch ((Protocol.MinuteFrameworkProtocol.SystemMessageType)header.optNumber) { case Protocol.MinuteFrameworkProtocol.SystemMessageType.GameOver: SettingManager.IsPlaying = false; Connections.getInstance().Dispose(); SettingManager.customEndingHandler(Protocol.MinuteFrameworkProtocol.ParseEndGamePacket(msg, 0, msg.Length)); Environment.Exit(0); break; case Protocol.MinuteFrameworkProtocol.SystemMessageType.GameStart: SettingManager.IsPlaying = true; break; default: break; } }
/// <summary> /// 미닛 프레임워크 내장 메세지를 처리하는 방법을 정의합니다. /// </summary> /// <param name="header">들어온 메세지의 헤더를 의미합니다.</param> /// <param name="msg">들어온 메세지의 본문을 의미합니다.</param> internal static void MinuteFrameworkMsgHandle(Protocol.MinuteFrameworkProtocol.Header header, byte[] msg) { if (header.isFrameworkMessage == 0) { SettingManager.customMessageHandleDelegate(header, msg); return; } switch ((Protocol.MinuteFrameworkProtocol.TypeNumber)header.typeNumber) { case Protocol.MinuteFrameworkProtocol.TypeNumber.GameSystemMessage: GameSystemMessageHandle(header, msg); break; case Protocol.MinuteFrameworkProtocol.TypeNumber.GameInfo: GameInfoMessageHandle(header, msg); break; default: break; } }