mainForm 클래스
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace csharp_test_client
{
public partial class mainForm
{
Dictionary<PACKET_ID, Action<byte[]>> PacketFuncDic = new Dictionary<PACKET_ID, Action<byte[]>>();
- PACKET_ID, Action<byte[]>를 key/value로 갖는 딕셔너리 PacketFuncDic 선언
- 여러 종류의 패킷 함수 모음?
- Action<byte[]> : 델리게이트
- 패킷의 식별자에 따라 해당 패킷을 처리하는 메서드를 참조하기 위해 사용
SetPacketHandler
void SetPacketHandler()
{
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ECHO, PacketProcess_Echo);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ERROR_NTF, PacketProcess_ErrorNotify);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_LOGIN_RES, PacketProcess_LoginResponse);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_ENTER_RES, PacketProcess_RoomEnterResponse);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_USER_LIST_NTF, PacketProcess_RoomUserListNotify);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_NEW_USER_NTF, PacketProcess_RoomNewUserNotify);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_LEAVE_RES, PacketProcess_RoomLeaveResponse);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_LEAVE_USER_NTF, PacketProcess_RoomLeaveUserNotify);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_CHAT_RES, PacketProcess_RoomChatResponse);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_CHAT_NOTIFY, PacketProcess_RoomChatNotify);
PacketFuncDic.Add(PACKET_ID.PACKET_ID_ROOM_RELAY_NTF, PacketProcess_RoomRelayNotify);
}
- 패킷 처리기를 설정하는 메서드
- 각 패킷의 식별자(PACKET_ID)에 해당하는 패킷 처리 메서드를 위에서 만든 PacketFuncDic 딕셔너리에 등록
- ex) ID ECHO에 해당하는 패킷에, PacketProcess_Echo 메서드를 등록
PacketProcess
void PacketProcess(PacketData packet)
{
// 받은 패킷의 패킷ID를 이용해서 패킷 타입 저장
var packetType = (PACKET_ID)packet.PacketID;
//DevLog.Write("Packet Error: PacketID:{packet.PacketID.ToString()}, Error: {(ERROR_CODE)packet.Result}");
//DevLog.Write("RawPacket: " + packet.PacketID.ToString() + ", " + PacketDump.Bytes(packet.BodyData));
// 패킷 타입에 맞는 키가 딕셔너리에 있으면
if (PacketFuncDic.ContainsKey(packetType))
{
// 해당하는 타입에 맞는 메서드에 매개변수로 패킷의 BodyData 넣어줌
PacketFuncDic[packetType](packet.BodyData);
}
else // 키가 없으면
{
// 알수없는 패킷ID라고 출력
DevLog.Write("Unknown Packet Id: " + packet.PacketID.ToString());
}
}
- 패킷을 받아서 패킷의 ID에 해당하는 메서드를 딕셔너리에서 찾아서 실행하는 함수
PacketProcess_Echo
void PacketProcess_Echo(byte[] bodyData)
{
DevLog.Write($"Echo 받음: {bodyData.Length}");
}
PacketProcess_ErrorNotify
void PacketProcess_ErrorNotify(byte[] bodyData)
{
var notifyPkt = new ErrorNtfPacket();
notifyPkt.FromBytes(bodyData);
DevLog.Write($"에러 통보 받음: {notifyPkt.Error}");
}
- 받은 Packet에 해당하는 객체 만들고 받은 bodyData를 변환해서 넣음