void Receive() { int nRead = 0;//이거몬지 선영이한테 물어보기 try { m_bConnect = true; while (m_bConnect && m_stream != null) { Array.Clear(readBuffer, 0, 1024 * 4); if (m_Client.Connected) { try { nRead = m_stream.Read(readBuffer, 0, 1024 * 4); } catch { Message("error at Receive -read"); m_stream.Close(); } Packet packet = (Packet)Packet.Desserialize(readBuffer); if ((int)packet.Type == (int)PacketType.채팅) { Chat_data chat = (Chat_data)Packet.Desserialize(readBuffer); Message(chat.nickname + ":" + chat.data); } else if ((int)packet.Type == (int)PacketType.그림) { //그림일 때 추가 } else if ((int)packet.Type == (int)PacketType.정답) { Correct_data correct = (Correct_data)Packet.Desserialize(readBuffer); if (correct.nickname == me.nickname) { Message("정답입니다");//본인이 맞췄을 때는 정답입니다로 출력 Hide(true); } else { Message(correct.nickname + "님이 정답을 맞추셨습니다."); //messagebox할라다 별로길래 냅둠 Message(correct.nickname + "님이 그리는 중입니다"); Hide(false); } lblKeyword.Text = ""; //클라이언트가 내부적으로 걔점수라벨만 바꾸는게 낫나???아니면 서버가 플레이어정보배열 보내서 일괄 관리!? for (int i = 0; i < arrClient.Count; i++) { if (arrClient[i].nickname == correct.nickname) { arrClient[i].score += 1; lblScore[i].Text = arrClient[i].score.ToString(); } } } else if ((int)packet.Type == (int)PacketType.다음정답) { Answer ans = (Answer)Packet.Desserialize(readBuffer); Message("제시어는 " + ans.answer + "입니다"); Message("제시어를 그려주세요"); lblKeyword.Text = ans.answer;//퇴장 재참가할때 이거띄 우는거에는 상관없는지 고민 } else if ((int)packet.Type == (int)PacketType.참가) { New_Player new_player = (New_Player)Packet.Desserialize(readBuffer); Message(new_player.ligthInfo.nickname + "님이 입장하셨습니다"); //Player_light_Info light_info = new Player_light_Info();//가벼운정보들 저장용 arrClient.Add(new_player.ligthInfo); LoadScreen(); } else if ((int)packet.Type == (int)PacketType.게임종료) { End_Packet end = (End_Packet)Packet.Desserialize(readBuffer); Message("\n" + end.winner_name + "님이 " + end.winner_score + "점으로 승리하셨습니다" + "\n"); //뭔가 너무 눈에 안띄어서 일단 이렇게.. } else if ((int)packet.Type == (int)PacketType.나가기) { Exit_data exit = (Exit_data)Packet.Desserialize(readBuffer); Player_light_Info exit_member = new Player_light_Info(); exit_member.nickname = exit.nickname; Message(exit_member.nickname + "님이 나갔습니다"); arrClient.Remove(exit_member); LoadScreen(); } } } } catch { Message("client : error at Receive"); } }
void receive_client()//클라이언트 접속 받아들임 { try { m_listener = new TcpListener(ipAddr, PORT); m_listener.Start(); Message("서버시작. 클라이언트 접속 대기 중"); m_bStop = true; while (m_bStop) { hClient = m_listener.AcceptTcpClient(); if (hClient.Connected) { //여기서 join data 패킷 받고 m_stream = hClient.GetStream(); m_stream.Read(readBuffer, 0, 1024 * 4); //Packet packet = (Packet)Packet.Desserialize(readBuffer); Join_data join_data = (Join_data)Packet.Desserialize(readBuffer); Message(join_data.nickname + "님이 로그인 시도");//입장했다는 메세지보다 더 명확한의미로 시도로 바꿈 Join_result join_result = new Join_result(); join_result.Type = (int)PacketType.연결; //name 중복검사 if (!checkName(join_data.nickname)) // => 클라이언트에게 name중복임을 알리고 처리하도록 (연결안됨-게임폼으로 못넘어가게) { //중복이면 연결해제하고 count--하고 관련된 것들 처리 필요 //connection=false전달 Message("이름 중복 발생. client연결 해제함"); join_result.success = false; join_result.reason = "이름중복"; Packet.Serialize(join_result).CopyTo(sendBuffer, 0); Send(); m_stream.Close(); Array.Clear(sendBuffer, 0, 1024 * 4); hClient.Close(); continue; } //4명이상인지 검사 if (count_client < 4) { count_client++; } else { //클라이언트에게 연결실패 전달 Message("4명 넘음. 클라이언트 연결 해제"); join_result.success = false; join_result.reason = "인원초과"; Packet.Serialize(join_result).CopyTo(sendBuffer, 0); Send(); m_stream.Close(); Array.Clear(sendBuffer, 0, 1024 * 4); hClient.Close(); continue; } Message(join_data.nickname + "님 로그인 성공"); //위의 로그인 조건 확인 뒤 로그인 성공 띄움 Player_Info info = new Player_Info(); //Client_Info 멤버변수 초기화해서 배열에 넣는 과정 info.client = hClient; if (count_client == 1) { info.drawable = true; //최초 client에게 그리기 권한 - 클라이언트들이 중간에 나가지 않는다는 가정하에 } else { info.drawable = false; } bool is_exist = false; Player_light_Info light_info = new Player_light_Info();//가벼운정보들 클라이언트에 전달용 for (int i = 0; i < arrMember.Count; i++) { if (join_data.nickname == arrMember[i].nickname) //기존 존재하는 닉네임인 경우 저장되어있는 점수 불러옴 { arrMember[i].img_num = join_data.img_num; //로그인할때 설정한 이미지 정보 회원정보에 저장 info.nickname = arrMember[i].nickname; info.img_num = arrMember[i].img_num; info.score = arrMember[i].score;//게임한판진행 중에 중간에 나갔다가 들어왔을때 점수 유지 arrClient.Add(info);//현재 플레이중 플레이어들 배열에 추가 is_exist = true; light_info.score = arrMember[i].score;//판이 끝나기 전에 저장되어있던 점수 light_info.match = arrMember[i].match; light_info.win = arrMember[i].win; light_info.lose = arrMember[i].lose; } } if (!is_exist)//기존 존재하는 닉네임이 아닌경우 { Member_Info minfo = new Member_Info(); minfo.nickname = join_data.nickname; arrMember.Add(minfo);//회원정보리스트에 추가 info.nickname = join_data.nickname; info.img_num = join_data.img_num; arrClient.Add(info); //플레이어리스트에 추가 light_info.score = 0; //처음들어오는거면 점수 0 light_info.match = 0; light_info.win = 0; light_info.lose = 0; } light_info.nickname = join_data.nickname; light_info.img_num = join_data.img_num; arrClientlight.Add(light_info); //연결문제없음. 성공 전달///////////////////////연결성공 전달할때 현재 플레이어 상태도 보내야할듯. 사진이랑 닉네임정보 join_result.success = true; join_result.arrClient = arrClientlight.ToList(); if (count_client == 1) { join_result.it = true; join_result.first_answer = answer; } else { join_result.it = false; join_result.first_answer = ""; } Packet.Serialize(join_result).CopyTo(sendBuffer, 0); Send(); New_Player player = new New_Player(); player.Type = (int)PacketType.참가; player.ligthInfo = light_info; sendToAll(player, hClient); Client_handler(); } } } catch { Message("error at receive_client"); } }