Ejemplo n.º 1
0
        private void StartServer()
        {
            loginCount = 0;
            Console.WriteLine("Server IP Address : " + Get_MyIP());
            Console.WriteLine("************************************************************");
            Console.Write("Port Number : ");

            port = int.Parse(Console.ReadLine());
            Console.WriteLine("My port is " + port);

            //서버 소켓 생성
            //サーバーのSocket
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //IP , Port
            ipEndPoint = new IPEndPoint(IPAddress.Any, port);
            server.Bind(ipEndPoint);
            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

            //데이터베이스 연결설정 ADMIN ID, PASS를 입력받음
            //データベースの連動設定
            string db = "gamebase";

            Console.WriteLine("************************************************************");
            Console.Write("Database admin ID : ");
            DB_ADMIN_ID = Console.ReadLine();
            Console.WriteLine("************************************************************");

            Console.Write("Database admin Pass : "******"************************************************************");


            //데이터베이스 로그인
            //データベースログイン
            DB_Connecton database = new DB_Connecton(db, DB_ADMIN_ID, DB_ADMIN_PASS);



            //몬스터리스트 추가 및 데이터베이스에서 몬스터정보 로드
            //モンスターのリスト追加およびデータベースからのモンスター情報をロード
            database.getMonsterDB();

            //필드 몬스터 생성 및 처리 (접속 클라이언트가 없을경우 전송하지는 않는다. )
            //モンスターの召喚および処理(接続したクライアントが存在する場合のみ)
            MonsterService();



            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


            server.Listen(8); //동시 접속자수 제한, 서버오픈


            Console.WriteLine("접속자 대기중...");


            while (true)
            {
                //클라이언트를 받아옴
                //クライアント接続
                Socket client = server.Accept();

                //Client IP
                string address = client.RemoteEndPoint.ToString();

                // addressArray[0] = IP, addressArray[1] = Port
                string[] addressArray = address.Split(new char[] { ':' });

                //Client Address
                Console.WriteLine("클라이언트 접속 성공! \n 클라이언트 정보 " + address);

                //Stream
                NetworkStream networkStream = new NetworkStream(client);
                StreamReader  streamReader  = new StreamReader(networkStream);

                //클라이언트 데이터 구조체를 생성
                //クライアントデータの構造体を生成
                Client_Data c_data = new Client_Data();
                c_data.socket = client;


                //클라이언트 데이터 리스트를 업데이트함
                //クライアントデータをアップデート
                clientList.Add(c_data);

                //접속자 표시
                //接続者 表示
                Console.WriteLine("새로운 클라이언트 연결됨");


                //스레드 처리
                //スレッド処理
                Thread serviceThread = new Thread(delegate()
                {
                    try
                    {
                        //게임 서비스 시작
                        //ゲームサービス開始
                        Run(c_data, networkStream, streamReader, database);
                    }
                    catch (Exception e)
                    {
                        for (int i = 0; i < clientList.Count; i++)
                        {
                            Client_Data sk = clientList.ToArray <Client_Data>()[i];

                            if (sk.socket == client)
                            {
                                Console.WriteLine("접속해제 클라이언트 정보 : " + address);

                                for (int j = 0; j < monsterList.Count; j++)
                                {
                                    Monster_Data monster = monsterList.ToArray <Monster_Data>()[j];

                                    if (monster.target_name == sk.ID_name)
                                    {
                                        monster.target_name = "";
                                        monster.stat.anime  = "IDLE";
                                    }
                                }



                                //클라이언트 리스트에서 제거
                                //クライアントリストから取り除く
                                clientList.RemoveAt(i);
                                client.Close();



                                //전체멀티케스트
                                //全員に送信
                                TcpMultiCast("<<[" + address + "] 님이 채팅방에서 나가셨습니다.>>");
                            }
                        }
                    }
                });
                //Start Thread
                serviceThread.Start();
            }
        }
Ejemplo n.º 2
0
        //서비스 스레드
        //サービススレッド
        static void Run(Client_Data clientData, NetworkStream networkStream, StreamReader streamReader, DB_Connecton database)
        {
            Console.WriteLine("서비스스레드 시작");
            while (true)
            {
                Thread.Sleep(100);
                if (!clientData.socket.Connected)
                {
                    int i = 0;
                    foreach (Client_Data sk in clientList)
                    {
                        if (sk.socket == clientData.socket)
                        {
                            clientList.RemoveAt(i);
                            clientData.socket.Close();

                            break;
                        }
                        i++;
                    }
                }
                else
                {
                    while ((readMassage = streamReader.ReadLine()) != null)
                    {
                        //Read Massage from Client
                        // Console.WriteLine("수신된 메시지 : " + readMassage);

                        string[] msgArr = readMassage.Split(new char[] { '$' }); //$로 구분

                        // msgArr[0] = "NEWPLAYER"
                        // msgArr[0] = "LOGIN"
                        // msgArr[0] = "LOGOUT"
                        // msgArr[0] = "TALK"
                        // msgArr[0] = "MONSTER"
                        // msgArr[0] = "PLAYER"
                        switch (msgArr[0])
                        {
                        case "NEWPLAYER":
                            Console.WriteLine("플레이어 가입시도");
                            string msg = database.AddplayerDB(msgArr[1]);
                            //응답 메시지 전송
                            //応答メッセージ送信
                            SendMessage(clientData.socket, msg);

                            break;

                        case "LOGIN":
                            Console.WriteLine("플레이어 로그인 시도");
                            string msg2 = database.login_playerDB(msgArr[1], clientData.socket);
                            //응답 메시지 전송
                            //応答メッセージ送信
                            SendMessage(clientData.socket, msg2);
                            break;

                        case "LOGOUT":
                            Console.WriteLine("플레이어 로그아웃 요청");
                            string msg3 = database.logout_playerDB(msgArr[1]);
                            TcpMultiCast(msg3);
                            break;

                        case "TALK":
                            Console.WriteLine("채팅요청");
                            TcpMultiCast(readMassage);
                            break;


                        case "MONSTER":
                            string[] monArr = msgArr[1].Split(new char[] { '#' });
                            Console.WriteLine("몬스터 스테이터스 수신");     //이름,HP만
                            for (int i = 0; i < monsterList.Count; i++)
                            {
                                Monster_Data mon = monsterList.ToArray <Monster_Data>()[i];

                                //이름이 같을경우
                                //名前が同じ場合
                                if (mon.ID_name == monArr[0])
                                {
                                    mon.HP = int.Parse(monArr[1]);
                                    //해당 데이터를 삭제
                                    //該当データを削除
                                    monsterList.RemoveAt(i);
                                    //새 데이터로 추가
                                    //新しいデータを追加
                                    monsterList.Insert(i, mon);
                                }
                            }
                            break;

                        case "PLAYER":

                            // 0 = x , 1 = y , 2 =anime , 3 =name_id
                            string[] statArr = msgArr[1].Split(new char[] { '#' });


                            for (int i = 0; i < clientList.Count; i++)
                            {
                                Client_Data cData = clientList.ToArray <Client_Data>()[i];

                                //이름이 같을경우
                                //名前が一致する場合
                                if (cData.ID_name == statArr[0])
                                {
                                    cData.ID_name    = statArr[0];
                                    cData.stat.x     = float.Parse(statArr[1]);
                                    cData.stat.y     = float.Parse(statArr[2]);
                                    cData.stat.anime = statArr[3];
                                    cData.stat.angle = float.Parse(statArr[4]);

                                    //해당 데이터를 삭제
                                    //該当 データを削除
                                    clientList.RemoveAt(i);
                                    //새 데이터로 추가
                                    //新しいデータを追加
                                    clientList.Insert(i, cData);
                                }
                            }

                            //전 클라이언트에 해당 플레이어의 위치를 알림
                            //全てのクライアントに該当プレイヤーの座標を知らせる。
                            TcpMultiCast(readMassage);
                            break;
                        }
                    }
                }
            }
        }