Esempio n. 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");
            }
        }
Esempio n. 2
0
        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");
            }
        }