public void SendRanking()
    {
        StreamReader reader   = new StreamReader("server.txt");
        var          serverIp = reader.ReadLine();

        reader.Close();

        // 서버에 매칭 요청을 함.
        IPEndPoint serverEndpoint_IP = new IPEndPoint(IPAddress.Parse(serverIp), CS_PORT);
        EndPoint   targetEndPoint    = (EndPoint)serverEndpoint_IP;
        Socket     udpClient_server  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        udpClient_server.ReceiveTimeout = 5000;
        udpClient_server.SendTimeout    = 5000;
        CM_UpdateRanking myMsg = new CM_UpdateRanking();

        myMsg.name  = name;
        myMsg.score = lastKda;
        byte[] newMsg = MyTool.StructToBytes <CM_UpdateRanking>(myMsg);
        byte[] newBuf = new byte[newMsg.Length + 1];
        newBuf[0] = (byte)CTSType.UpdateRanking;
        for (int i = 0; i < newMsg.Length; ++i)
        {
            newBuf[i + 1] = newMsg[i];
        }
        udpClient_server.SendTo(newBuf, targetEndPoint);
        udpClient_server.Close();
    }
Example #2
0
    void Update()
    {
        while (messageQueue.Count != 0)   // 네트워크 메세지를 처리함.
        {
            if (messageQueue.Count > 0)
            {
                NetworkData receivedData;
                lock (listenerLocker)
                {
                    receivedData = messageQueue.Dequeue();
                }
                // 네트워크 처리
                if ((CTSType)receivedData.bytes[0] == CTSType.Matching)
                {
                    for (int i = matchingReadyClients.Count - 1; i >= 0; --i)
                    {
                        if (MyTool.EndPointToIp(matchingReadyClients[i]) == MyTool.EndPointToIp(receivedData.ep))
                        {
                            matchingReadyClients.Remove(matchingReadyClients[i]);
                        }
                    }
                    matchingReadyClients.Add(receivedData.ep);
                    byte[] buf = new byte[1];
                    buf[0] = (byte)STCType.Connected;
                    udpSocket.SendTo(buf, receivedData.ep);
                    Print("매칭 요청 성공, 매칭 중인 유저 수 : " + matchingReadyClients.Count + " " + MyTool.EndPointToIp(receivedData.ep));
                }
                else if ((CTSType)receivedData.bytes[0] == CTSType.Disconnect)
                {
                    matchingReadyClients.Remove(receivedData.ep);
                    Print("매칭 해제 성공");
                }
                else if ((CTSType)receivedData.bytes[0] == CTSType.UpdateRanking)
                {
                    byte[] buf = new byte[receivedData.bytes.Length - 1];
                    for (int i = 0; i < receivedData.bytes.Length - 1; ++i)
                    {
                        buf[i] = receivedData.bytes[i + 1];
                    }
                    CM_UpdateRanking rankingRequest = MyTool.BytesToStruct <CM_UpdateRanking>(buf);
                    // 랭킹을 등록 시켜줌
                    {
                        //DB정보 입력
                        string sqlDatabase = "Server=" + sqlDBip + ";Database=" + sqlDBname + ";UserId=" + sqlDBid + ";Password="******"";
                        //접속 확인하기
                        try
                        {
                            sqlconn = new MySqlConnection(sqlDatabase);
                            sqlconn.Open();

                            MySqlCommand dbcmd = new MySqlCommand("insert into myrank (id, kda) values ('" + rankingRequest.name + "', " + rankingRequest.score + ");", sqlconn); //명령어를 커맨드에 입력
                            dbcmd.ExecuteNonQuery();                                                                                                                              //명령어를 SQL에 보냄

                            sqlconn.Close();
                            Print("랭킹 등록 : " + rankingRequest.name + " " + rankingRequest.score);
                        }
                        catch (Exception e)
                        {
                            Print("DB 접속 실패 : " + e.Message);
                            transform.Find("DBState").GetComponent <UnityEngine.UI.Text>().text = "DB상태 : <color=red>접속실패</color>";
                        }
                    }
                }
                else if ((CTSType)receivedData.bytes[0] == CTSType.SelectRanking)
                {
                    // 랭킹을 조회 시켜줌
                    {
                        //DB정보 입력
                        string sqlDatabase = "Server=" + sqlDBip + ";Database=" + sqlDBname + ";UserId=" + sqlDBid + ";Password="******"";
                        //접속 확인하기
                        try
                        {
                            sqlconn = new MySqlConnection(sqlDatabase);
                            sqlconn.Open();

                            DataTable       dt  = new DataTable(); //데이터 테이블을 선언함
                            MySqlCommand    cmd = new MySqlCommand("select id, kda from myrank order by kda desc limit 10;", sqlconn);
                            MySqlDataReader rdr = cmd.ExecuteReader();

                            string newString = "";
                            int    count     = 1;
                            while (rdr.Read())
                            {
                                newString += count + "@" + rdr["id"] + "&" + int.Parse(rdr["kda"] + "") + "$";
                                count++;
                            }
                            rdr.Close();
                            sqlconn.Close();

                            byte[] stringBuf = Encoding.UTF8.GetBytes(newString);
                            byte[] sendBuf   = new byte[stringBuf.Length + 1];
                            sendBuf[0] = (byte)STCType.SelectRanking;
                            for (int i = 0; i < stringBuf.Length; ++i)
                            {
                                sendBuf[i + 1] = stringBuf[i];
                            }
                            udpSocket.SendTo(sendBuf, receivedData.ep);

                            Print("랭킹 조회 : " + newString);
                        }
                        catch (Exception e)
                        {
                            Print("DB 접속 실패 : " + e.Message);
                            transform.Find("DBState").GetComponent <UnityEngine.UI.Text>().text = "DB상태 : <color=red>접속실패</color>";
                        }
                    }
                }
            }
        }
        while (matchingReadyClients.Count >= 2) // 리스트의 0번과 1번을 매칭 시켜줌.
        {
            // 1의 정보를 0에 전송
            {
                byte[] newBuf = new byte[1];
                newBuf[0] = (byte)STCType.Mathched_S;
                udpSocket.SendTo(newBuf, matchingReadyClients[0]);
            }
            // 0의 정보를 1에 전송
            {
                byte[] newMsg = Encoding.UTF8.GetBytes(MyTool.EndPointToIp(matchingReadyClients[0]));
                byte[] newBuf = new byte[newMsg.Length + 1];
                newBuf[0] = (byte)STCType.Mathched_C;
                for (int i = 0; i < newMsg.Length; ++i)
                {
                    newBuf[i + 1] = newMsg[i];
                }
                udpSocket.SendTo(newBuf, matchingReadyClients[1]);
            }
            matchingReadyClients.Remove(matchingReadyClients[1]);
            matchingReadyClients.Remove(matchingReadyClients[0]);
            Print("매칭 성사 !, 매칭 중인 유저 수 : " + matchingReadyClients.Count);
        }
        if (dieFlag)
        {
            Print("쓰레드 재실행!");
            listenerThread = new Thread(new ThreadStart(NetworkListener));
            listenerThread.Start();
            dieFlag = false;
        }
    }