Exemple #1
0
        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");
            }
        }
Exemple #2
0
        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
            }
        }