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; } } } } }
// 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 }
/// <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 }
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)); } }