/* 구분자 패킷 설계 * 1) 크게 명령, 구분자, 데이터 3부분으로 나눈다 * 2) 명령에 따라 데이터를 어떻게 해석할지 정한다 * 3) 명령이 먼저 나온다 * 4) 예시 * 4-1) 명령의 종류 C : 채팅 * S : 정해진 초 이후에 나를 해제 * B : WinForm의 배경색 * 4-2) 구분자 : | * 4-3) C|안녕하세요 * S|3 * B|Gold */ /// <summary> /// 정해진 약속에 따라 패킷을 처리하는 함수 /// </summary> /// <param name="srcData">클라이언트가 보내온 전체 데이터</param> /// <param name="sendClient">데이터를 보낸 클라이언트</param> void ProcessPacket(string srcData, SocketData sendClient) { string[] datas = srcData.Split(new char[] { '|' }); switch (datas[0]) { case "C": AddRecvListBox(String.Format("[채팅] [{0}] {1}", sendClient.ip, srcData)); SendAllData(datas[1], sendClient); break; case "S": { AddRecvListBox(String.Format("[해제] [{0}] {1}", sendClient.ip, srcData)); int sec = Int32.Parse(datas[1]); // 정해진 초 후에 처리할 스레드에 전달할 인자 SocketCloseData scd = new SocketCloseData(); scd.client = sendClient; scd.sec = sec; Thread tClose = new Thread(new ParameterizedThreadStart(ThreadClose)); tClose.Start(scd); } break; case "B": AddRecvListBox(String.Format("[배경] [{0}] {1}", sendClient.ip, srcData)); Color color = Color.FromName(datas[1]); this.BackColor = color; break; } }
void ThreadClose(object s) { SocketCloseData scd = (SocketCloseData)s; Thread.Sleep(scd.sec * 1000); DeleteClientAddressFromListView(scd.client); DeleteClientFromList(scd.client); }
void ThreadClose(object s) { SocketCloseData scd = (SocketCloseData)s; Thread.Sleep(scd.sec * 1000); }