private void ParsePacket(byte[] packetData, NetworkManager netManager)
        {
            int packetType = packetData[0];

            try
            {
                IncomingPacket packet = null;

                //remove header
                byte[] tmp = new byte[packetData.Length - 1];
                Array.Copy(packetData, 1, tmp, 0, tmp.Length);
                packetData = tmp;

                switch (packetType)
                {
/////////////////////////////////
                case 4:
                    packet = new SystemMessage00();
                    break;

                case 5:
                    packet = new KeepAliveAnswer00(netManager);
                    break;

                case 6:
                    packet = new AuthSuccess00(netManager);
                    break;

                case 7:
                    packet = new PlayerInfo00();
                    break;

                case 8:
                    packet = new SayToChat00();
                    break;
////////////////////////////////////////

                default:
                    ClientLog.LogPacket("UNKNOWN PACKET => ", packetType, packetData, true);
                    break;
                }
                if (packet != null)
                {
                    packet.SetData(packetType, packetData);
                }
                ClientLog.LogPacket("client<=server ", packetType, packetData, false);
            }
            catch (Exception exc)
            {
                ClientLog.LogPacket("PROBLEM PARSING PACKET => ", packetType, packetData, true);
                if (exc.Message != null)
                {
                    Debug.Log("ERR: " + exc.Message);
                }
            }
        }
        // =============== отправка пакетов=============================
        public void SendPacket(OutgoingPacket packet)
        {
            if (!clientConnected)
            {
                return;
            }

            byte[] data = packet.GetData();

            ClientLog.LogPacket("client=>server ", 0, data, false);

            //добавляем длину пакета
            var list = new List <byte>(data);

            byte[] cryptCheaper = new byte[2];
            int    a1           = UnityEngine.Random.Range(6, 250);
            int    a2           = UnityEngine.Random.Range(1, 31);

            cryptCheaper[0] = (byte)a1;
            cryptCheaper[1] = (byte)a2;

            list.InsertRange(0, cryptCheaper);

            list.InsertRange(0, BitConverter.GetBytes((Int16)(data.Length + 4)));

            data = list.ToArray();

            bool thisIsLogoutPacket = false;

            if (packet is SendLogout00)
            {
                thisIsLogoutPacket = true;
            }

            SendData(data, thisIsLogoutPacket);
        }
        // =============== прием пакетов=============================

        private void DoRead(IAsyncResult ar)
        {
            if (!clientConnected)
            {
                ClearBuffer();
                return;
            }

            int countBytesRead;

            try
            {
                //if (!testMode)
                countBytesRead = client.GetStream().EndRead(ar);

                //это код ошибки соединения. разрываем соединение.
                if (countBytesRead < 1)
                {
                    Disconnect(true);
                    return;
                }

                //if (testMode)
                //    countBytesRead = testreciviedCountBytes;

                //сохраняем в рабочий буфер, то что пришло из только что полученного.
                Array.Copy(readBuffer, 0, receivedBuffer, receivedBufferPos, countBytesRead);
                receivedBufferPos += countBytesRead;
                if (receivedBufferPos < 5)
                {
                    Debug.Log("not bug. dont worry. info-packet header no full");
                    BeginRead();
                    return;
                }

                int packetSizeWithHeader = GetPacketSizeWithHeaderSize(0);

                //ClientLog.LogFullBuffer(readBuffer);
                // ClientLog.LogBuffer(receivedBuffer, 200);

                if (IsWrongPacketSize(packetSizeWithHeader))
                {
                    ClearBuffer();
                    BeginRead();
                    return;
                }

                // проверка того что пакет пришел полностью. в буфере меньше чем длина пакета.
                if (packetSizeWithHeader > receivedBufferPos)
                {
                    BeginRead();
                    return;
                }

                int iterations = 0;
                //читаем пакеты из массива перемещая индекс на положение нового пакета
                int NextPacketIndex = 0;
                while (iterations < 300)
                {
                    iterations++;

                    //определяем размер пакета без заголовка

                    int packetSize = GetPacketSizeWithHeaderSize(NextPacketIndex) - PACKET_HEADER_SIZE;
                    if (IsWrongPacketSize(packetSize))
                    {
                        ClearBuffer();
                        BeginRead();
                        return;
                    }

                    //Debug.Log("a=" + "b=" + packetSize);

                    //создаем массив содержащий пакет без заголовка
                    byte[] packetBuffer = new byte[packetSize];
                    Array.Copy(receivedBuffer, NextPacketIndex + PACKET_HEADER_SIZE, packetBuffer, 0, packetSize);

                    //передача единичного пакета в основной поток на обработку.
                    packetParser.AddPacket(packetBuffer);
                    if (Settings.packetLoggingEnabled)
                    {
                        ClientLog.LogPacket("add", packetBuffer[0], packetBuffer, true);
                    }

                    //увеличиваем индекс на положение следующего пакета
                    NextPacketIndex += packetSize + PACKET_HEADER_SIZE;

                    //буфер достиг конца.
                    if (NextPacketIndex >= receivedBufferPos)
                    {
                        ClearBuffer();
                        BeginRead();
                        return;
                    }

                    //в буфере еще не пришла вся инфо о длине следующего пакета
                    if (receivedBufferPos - NextPacketIndex < 5)
                    {
                        // Debug.Log("not bug2. dont worry. packet header no full");
                        CompactBuffer(NextPacketIndex);
                        BeginRead();
                        return;
                    }

                    //этот пакет пришел не до конца. ждем когда придет оставщийся кусок.
                    int packetSizeWithHeader2 = GetPacketSizeWithHeaderSize(NextPacketIndex);
                    if (packetSizeWithHeader2 + NextPacketIndex > receivedBufferPos)
                    {
                        //Debug.Log("not bug. packet no full");
                        CompactBuffer(NextPacketIndex);
                        BeginRead();
                        return;
                    }
                    //значит в буфере есть еще готовый пакет. возвращаемся к началу цикла.
                }
            }
            catch (IOException ex)
            {
                Debug.Log("errorIO: " + ex);
                Disconnect(true);
                return;
            }
            catch (Exception ex)
            {
                Debug.Log("error : " + ex);
                Disconnect(true);
            }
        }