Esempio n. 1
0
    private byte[] xorScale = new byte[] { 45, 66, 38, 55, 23, 251, 9, 166, 90, 19, 41, 45, 201, 58, 55, 37, 254, 185, 165, 169, 19, 171 };    //.data文件的xor加解密因子
    #endregion

    #region GameDataTableParser 构造函数
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="path"></param>
    public ReadExcelAndParss(string path)
    {
        m_FieldNameDic = new Dictionary <string, int>();
        byte[] buffer = null;

        //------------------
        //第1步:读取文件
        //------------------
        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
        }

        //------------------
        //第2步:解压缩
        //------------------
        buffer = ZlibHelper.DeCompressBytes(buffer);

        //------------------
        //第3步:xor解密
        //------------------
        int iScaleLen = xorScale.Length;

        for (int i = 0; i < buffer.Length; i++)
        {
            buffer[i] = (byte)(buffer[i] ^ xorScale[i % iScaleLen]);
        }

        //------------------
        //第4步:解析数据到数组
        //------------------
        using (MMoMemorySteam ms = new MMoMemorySteam(buffer))
        {
            m_Row    = ms.ReadInt();
            m_Column = ms.ReadInt();

            m_GameData  = new String[m_Row, m_Column];
            m_FieldName = new string[m_Column];

            for (int i = 0; i < m_Row; i++)
            {
                for (int j = 0; j < m_Column; j++)
                {
                    string str = ms.ReadString();

                    if (i == 0)
                    {
                        //表示读取的是字段
                        m_FieldName[j]      = str;
                        m_FieldNameDic[str] = j;
                    }
                    else if (i > 2)
                    {
                        //表示读取的是内容
                        m_GameData[i, j] = str;
                    }
                }
            }
        }
    }
Esempio n. 2
0
    // Update is called once per frame
    void Update()
    {
        #region 从队列中获取数据
        while (true)
        {
            if (m_ReceiveCount <= 5)
            {
                m_ReceiveCount++;
                lock (m_ReceiveQueue)
                {
                    if (m_ReceiveQueue.Count > 0)
                    {
                        //buffer 包体(队列中的数据包)
                        byte[] buffer = m_ReceiveQueue.Dequeue();
                        //这是异或之后的数组
                        byte[] bufferNew = new byte[buffer.Length - 3];

                        bool isCompress = false;

                        ushort crc = 0;

                        using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
                        {
                            isCompress = ms.ReadBool();
                            crc        = ms.ReadUShort();
                            ms.Read(bufferNew, 0, bufferNew.Length);
                        }

                        //校验Crc
                        int newCrc = Crc16.CalculateCrc16(bufferNew);
                        Debug.Log("传递Crc=" + crc);
                        Debug.Log("本地newCrc=" + newCrc);
                        if (newCrc == crc)//本地Crc与数据包的进行校验
                        {
                            //异或 得到原始数据
                            bufferNew = SecurityUtil.Xor(bufferNew);

                            if (isCompress)//如果压缩了
                            {
                                //进行解压
                                bufferNew = ZlibHelper.DeCompressBytes(bufferNew);
                            }

                            ushort protoCode = 0;

                            byte[] protoContent = new byte[bufferNew.Length - 2];
                            using (MMO_MemoryStream ms = new MMO_MemoryStream(bufferNew))
                            {
                                //读 协议编号
                                protoCode = ms.ReadUShort();
                                //读内容
                                ms.Read(protoContent, 0, protoContent.Length);

                                //派发协议编号和内容
                                EventDispatcher.Instance.Dispath(protoCode, protoContent);
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            else
            {
                m_ReceiveCount = 0;
                break;
            }
        }
        #endregion
    }
Esempio n. 3
0
        /// <summary>
        /// 检查接收到的数据包
        /// </summary>
        public void OnReceiveDataDis()
        {
            #region 从队列中获取数据

            if (m_ReceiveCount <= 5)
            {
                m_ReceiveCount++;
                lock (m_ReceiveQueue)
                {
                    if (m_ReceiveQueue.Count > 0)
                    {
                        //得到队列中的数据包
                        byte[] buffer = m_ReceiveQueue.Dequeue();

                        //异或之后的数组
                        byte[] bufferNew = new byte[buffer.Length - 3];

                        bool   isCompress = false;
                        ushort crc        = 0;

                        using (ServerMemoryStream ms = new ServerMemoryStream(buffer))
                        {
                            isCompress = ms.ReadBool();
                            crc        = ms.ReadUShort();
                            ms.Read(bufferNew, 0, bufferNew.Length);
                        }

                        //先crc
                        int newCrc = Crc16.CalculateCrc16(bufferNew);

                        if (newCrc == crc)
                        {
                            //异或 得到原始数据
                            bufferNew = SecurityUtil.Xor(bufferNew);

                            if (isCompress)
                            {
                                bufferNew = ZlibHelper.DeCompressBytes(bufferNew);
                            }

                            ushort protoCode    = 0;
                            byte[] protoContent = new byte[bufferNew.Length - 2];
                            using (ServerMemoryStream ms = new ServerMemoryStream(bufferNew))
                            {
                                //协议编号
                                protoCode = ms.ReadUShort();
                                ms.Read(protoContent, 0, protoContent.Length);

                                //交给观察者分配处理
                                CSObserver.Instance.Dispatch(protoCode, protoContent, this);
                            }
                        }
                    }
                }
            }
            else
            {
                m_ReceiveCount = 0;
                OnReceiveDataDis();
            }
            #endregion
        }
        internal void OnUpdate()
        {
            if (m_IsConnectedOk)
            {
                m_IsConnectedOk = false;
                if (OnConnectOK != null)
                {
                    OnConnectOK();
                }
                Debug.Log("连接成功");
            }

            #region 从队列中获取数据
            while (true)
            {
                if (m_ReceiveCount <= 5)
                {
                    m_ReceiveCount++;
                    lock (m_ReceiveQueue)
                    {
                        if (m_ReceiveQueue.Count > 0)
                        {
                            //得到队列中的数据包
                            byte[] buffer = m_ReceiveQueue.Dequeue();

                            //异或之后的数组
                            byte[] bufferNew = new byte[buffer.Length - 3];

                            bool   isCompress = false;
                            ushort crc        = 0;

                            using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
                            {
                                isCompress = ms.ReadBool();
                                crc        = ms.ReadUShort();
                                ms.Read(bufferNew, 0, bufferNew.Length);
                            }

                            //先crc
                            int newCrc = Crc16.CalculateCrc16(bufferNew);

                            if (newCrc == crc)
                            {
                                //异或 得到原始数据
                                bufferNew = SecurityUtil.Xor(bufferNew);

                                if (isCompress)
                                {
                                    bufferNew = ZlibHelper.DeCompressBytes(bufferNew);
                                }

                                ushort protoCode    = 0;
                                byte[] protoContent = new byte[bufferNew.Length - 2];
                                using (MMO_MemoryStream ms = new MMO_MemoryStream(bufferNew))
                                {
                                    //协议编号
                                    protoCode = ms.ReadUShort();
                                    ms.Read(protoContent, 0, protoContent.Length);

                                    GameEntry.Event.SocketEvent.Dispatch(protoCode, protoContent);
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else
                {
                    m_ReceiveCount = 0;
                    break;
                }
            }
            #endregion
        }
Esempio n. 5
0
    public static void AssetBundleCopyToStreamingAsstes()
    {
        string toPath = Application.streamingAssetsPath + "/AssetBundles/";

        if (Directory.Exists(toPath))
        {
            Directory.Delete(toPath, true);
        }
        Directory.CreateDirectory(toPath);

        IOUtil.CopyDirectory(Application.persistentDataPath, toPath);

        //重新生成版本文件
        //1.先读取persistentDataPath里边的版本文件 这个版本文件里 存放了所有的资源包信息

        byte[] buffer  = IOUtil.GetFileBuffer(Application.persistentDataPath + "/VersionFile.bytes");
        string version = "";
        Dictionary <string, AssetBundleInfoEntity> dic    = ResourceManager.GetAssetBundleVersionList(buffer, ref version);
        Dictionary <string, AssetBundleInfoEntity> newDic = new Dictionary <string, AssetBundleInfoEntity>();

        DirectoryInfo directory = new DirectoryInfo(toPath);

        //拿到文件夹下所有文件
        FileInfo[] arrFiles = directory.GetFiles("*", SearchOption.AllDirectories);

        for (int i = 0; i < arrFiles.Length; i++)
        {
            FileInfo file     = arrFiles[i];
            string   fullName = file.FullName.Replace("\\", "/"); //全名 包含路径扩展名
            string   name     = fullName.Replace(toPath, "").Replace(".assetbundle", "").Replace(".unity3d", "");

            if (name.Equals("AssetInfo.json", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Windows", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Windows.manifest", StringComparison.CurrentCultureIgnoreCase)

                || name.Equals("Android", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("Android.manifest", StringComparison.CurrentCultureIgnoreCase)

                || name.Equals("iOS", StringComparison.CurrentCultureIgnoreCase) ||
                name.Equals("iOS.manifest", StringComparison.CurrentCultureIgnoreCase)
                )
            {
                File.Delete(file.FullName);
                continue;
            }

            AssetBundleInfoEntity entity = null;
            dic.TryGetValue(name, out entity);


            if (entity != null)
            {
                newDic[name] = entity;
            }
        }

        StringBuilder sbContent = new StringBuilder();

        sbContent.AppendLine(version);

        foreach (var item in newDic)
        {
            AssetBundleInfoEntity entity = item.Value;
            string strLine = string.Format("{0}|{1}|{2}|{3}|{4}", entity.AssetBundleName, entity.MD5, entity.Size, entity.IsFirstData ? 1 : 0, entity.IsEncrypt ? 1 : 0);
            sbContent.AppendLine(strLine);
        }

        IOUtil.CreateTextFile(toPath + "VersionFile.txt", sbContent.ToString());

        //=======================
        MMO_MemoryStream ms  = new MMO_MemoryStream();
        string           str = sbContent.ToString().Trim();

        string[] arr = str.Split('\n');
        int      len = arr.Length;

        ms.WriteInt(len);
        for (int i = 0; i < len; i++)
        {
            if (i == 0)
            {
                ms.WriteUTF8String(arr[i]);
            }
            else
            {
                string[] arrInner = arr[i].Split('|');
                ms.WriteUTF8String(arrInner[0]);
                ms.WriteUTF8String(arrInner[1]);
                ms.WriteInt(int.Parse(arrInner[2]));
                ms.WriteByte(byte.Parse(arrInner[3]));
                ms.WriteByte(byte.Parse(arrInner[4]));
            }
        }

        string filePath = toPath + "/VersionFile.bytes"; //版本文件路径

        buffer = ms.ToArray();
        buffer = ZlibHelper.CompressBytes(buffer);
        FileStream fs = new FileStream(filePath, FileMode.Create);

        fs.Write(buffer, 0, buffer.Length);
        fs.Close();

        AssetDatabase.Refresh();
        Debug.Log("初始资源拷贝到StreamingAsstes完毕");
    }
    /// <summary>
    /// 异步接受回调
    /// </summary>
    /// <param name="ar"></param>
    private void ReceiveCallBack(IAsyncResult ar)
    {
        try
        {
            int len = m_Socket.EndReceive(ar);
            if (len > 0)
            {
                //将接受的数组缓存到缓存数据流的尾部
                m_ReceiveMS.Position = m_ReceiveMS.Length;
                //byte[] 缓存到数据流中
                m_ReceiveMS.Write(m_ReceiveBuffer, 0, len);
                //说明至少有一个不完整的包传了过来
                if (m_ReceiveBuffer.Length > 2)
                {
                    while (true)
                    {
                        //指针位置经过writey已经下移,要读的话需要归0
                        m_ReceiveMS.Position = 0;
                        //读取包头包含的长度信息
                        ushort bodylen = m_ReceiveMS.ReadUShort();
                        //整个包大小
                        int fullLen = bodylen + 2;
                        //说明已经有一个完整的包读取下来
                        if (m_ReceiveMS.Length >= bodylen + 2)
                        {
                            //读取包头
                            byte[] newBuffer  = new byte[bodylen - 3];
                            bool   isCompress = m_ReceiveMS.ReadBool();
                            ushort crc        = m_ReceiveMS.ReadUShort();
                            m_ReceiveMS.Read(newBuffer, 0, bodylen - 3);
                            //1..异或
                            newBuffer = SecurityUtil.Xor(newBuffer);
                            //2.CRC1校验
                            ushort newCrc = Crc16.CalculateCrc16(newBuffer);
                            if (newCrc != crc)
                            {
                                break;
                            }
                            if (isCompress)
                            {
                                //3.解压
                                newBuffer = ZlibHelper.DeCompressBytes(newBuffer);
                            }
                            Debug.Log(newCrc);
                            lock (m_ReceiveQueue)
                            {
                                m_ReceiveQueue.Enqueue(newBuffer);
                            }
                            //处理剩余的包
                            int remainingLen = (int)m_ReceiveMS.Length - fullLen;
                            //---------
                            //重新写入数据流
                            //---------
                            if (remainingLen > 0)
                            {
                                //剩余数组缓冲
                                byte[] remianingBuffer = new byte[m_ReceiveMS.Length - fullLen];
                                //读取到剩余数组缓冲
                                m_ReceiveMS.Read(remianingBuffer, 0, remainingLen);
                                //格式化数据流
                                m_ReceiveMS.Position = 0;
                                m_ReceiveMS.SetLength(0);
                                //重新写入数据流
                                m_ReceiveMS.Write(remianingBuffer, 0, remianingBuffer.Length);
                            }
                            else
                            {
                                //格式化数据流
                                m_ReceiveMS.Position = 0;
                                m_ReceiveMS.SetLength(0);
                                break;
                            }
                        }
                        //包不完整
                        else
                        {
                            break;
                        }
                    }
                }

                ReceiveMsg();
            }
            //客户端主动断开连接
            else
            {
                Debug.Log(string.Format("服务器{0}主动断开连接", m_Socket.RemoteEndPoint));
            }
        }
        //客户端进程结束 被迫断开连接
        catch
        {
            Console.WriteLine(string.Format("服务器{0}被迫断开连接", m_Socket.RemoteEndPoint));
        }
    }