void Send_Chat() { Message(me.nickname + "(ME) : " + txtSendline.Text); try { if (m_Client.Connected) { Chat_data chat = new Chat_data(); chat.Type = (int)PacketType.채팅; chat.nickname = me.nickname; chat.data = txtSendline.Text; Packet.Serialize(chat).CopyTo(this.sendBuffer, 0);//메세지 패킷 보내기 Send(); txtSendline.Text = ""; } } catch { Message("채팅데이터 전송 실패"); } }
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"); } }
Chat_data chat_data;//이거 밖에있어야함? void receiveData() { TcpClient client = hClient; bool m_bConnect; Array.Clear(sendBuffer, 0, 1024 * 4); NetworkStream stream = client.GetStream(); streamList.Add(stream); if (stream != null) { m_bConnect = true; while (m_bConnect) { try { Array.Clear(readBuffer, 0, 1024 * 4); stream.Read(readBuffer, 0, 1024 * 4); } catch { Message("error발생"); return; //stream.Close(); //need check } Packet packet = (Packet)Packet.Desserialize(readBuffer); if ((int)packet.Type == (int)PacketType.채팅) { chat_data = (Chat_data)Packet.Desserialize(readBuffer); Message(chat_data.nickname + " : " + chat_data.data);//for test sendToAll(packet, client); if (answer == chat_data.data) //정답 처리하는 부분 { Correct_data correct_data = new Correct_data(); //클라이언트들에게 correct발생했다고 알림(correct패킷전송) correct_data.Type = (int)PacketType.정답; correct_data.nickname = getName(client); //맞춘 애 이름 담음 - client에서 **님이 정답을 맞췄습니다. 라고 출력 sendToAll(correct_data, null); //서버가 보낼 땐 null로... need check string correct_player = ""; bool end = false; for (int i = 0; i < arrClient.Count; i++) { if (client == arrClient[i].client) { arrClient[i].drawable = true; arrClient[i].score++; arrClientlight[i].score++; //중간에 나갔다 들어온사람한테 올바른 경기상태 전하려면 light정보 갱신 correct_player = arrClient[i].nickname; //맞춘사람 이름 if (arrClient[i].score == 3) { end = true; } } else { arrClient[i].drawable = false; } } foreach (Member_Info member in arrMember) { if (member.nickname == correct_player) { member.score++; } } if (end) { endGame(); Answer ans = new Answer(); ans.Type = (int)PacketType.다음정답; ans.answer = answer; Packet.Serialize(ans).CopyTo(sendBuffer, 0); stream.Write(sendBuffer, 0, sendBuffer.Length); stream.Flush(); Array.Clear(sendBuffer, 0, 1024 * 4); } else { count_game++; //몇 판 했는지 처리 if (count_game == 5) { endGame(); //5판끝났으면 endgame호출 } else { getAnswer(); //answer갱신 //정답자에게만 새로운 정답 알려줘야됨 Answer ans = new Answer(); ans.Type = (int)PacketType.다음정답; ans.answer = answer; Packet.Serialize(ans).CopyTo(sendBuffer, 0); stream.Write(sendBuffer, 0, sendBuffer.Length); stream.Flush(); Array.Clear(sendBuffer, 0, 1024 * 4);//이건왜 sendToAll로 안함? } } } } else if ((int)packet.Type == (int)PacketType.그림) { } else if ((int)packet.Type == (int)PacketType.나가기) { //나가기 패킷 받았으면 처리 //arrclient에서 삭제하고 얘가 나갔다고 클라이언트들에게 알린다 Exit_data exit = (Exit_data)Packet.Desserialize(readBuffer); Player_Info exit_member = new Player_Info(); exit_member.nickname = exit.nickname; Message(exit_member.nickname + "님이 나갔습니다. "); count_client--; //플레이어수 감소 sendToAll(exit, client); int exit_index = arrClient.IndexOf(exit_member); //객체넣어서비교말고 string으로만 indexOf 쓰고 싶었는데 잘안됨 arrClient.RemoveAt(exit_index); arrClientlight.RemoveAt(exit_index); } } //stream.Close(); //need check } }