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(); } }
//서비스 스레드 //サービススレッド 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; } } } } }