public WazClient() { mSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); mSession = new WazSession(mSock.Handle.ToInt64(), mSock); //mReciveBuff = new byte[mSock.ReceiveBufferSize]; mReceiveStream = new System.IO.MemoryStream(); //mSendPasser.Evt_WorkThread_Received += Handle_WorkThread_Received; //mReciveBuffExchange = new byte[mSock.ReceiveBufferSize]; //mReciveBuff = new List<ArraySegment<int>>(); //mSock.Blocking = false; }
public bool Send(WazSession s, object data) { Packable packAttr = (Packable)Attribute.GetCustomAttribute(data.GetType(), typeof(Packable)); if (packAttr == null) { return(false); } int sizePackOffsetLen = sizeof(PackageOffsetToEnd); try { //序列化 FieldInfo[] members = data.GetType().GetFields(); mMemSendStream.Position = 0; mMemSendStream.SetLength(0); mBinWriter.Write(mPackHead); long posPackLen = mMemSendStream.Position; //留空位给等下回来写包长度 mBinWriter.Seek(sizePackOffsetLen, SeekOrigin.Current); mBinWriter.Write(packAttr.ID); foreach (FieldInfo f in members) { object o = f.GetValue(data); WazSerializerHelper.Write(mBinWriter, o); } PackageOffsetToEnd offsetToEnd = (PackageOffsetToEnd)(mMemSendStream.Position - posPackLen - sizePackOffsetLen); mBinWriter.Write(mPackEnd); mBinWriter.Seek((int)posPackLen, SeekOrigin.Begin); mBinWriter.Write(offsetToEnd); mNetwork.Send(s, mMemSendStream.ToArray()); return(true); } catch { return(false); } }
/// <summary> /// 注册指定session,包触发的处理函数 /// </summary> /// <param name="s">S.</param> /// <param name="packType">Pack type.</param> /// <param name="handler">Handler.</param> public void RegEvtHandler(WazSession s, Type packType, Action <object> handler) { Dictionary <Type, Action <object> > packTypeMap; if (!mPackDispatchMap.TryGetValue(s.Handle, out packTypeMap)) { packTypeMap = new Dictionary <Type, Action <object> >(); mPackDispatchMap.Add(s.Handle, packTypeMap); } Action <object> tmpHandler; if (!packTypeMap.TryGetValue(packType, out tmpHandler)) { packTypeMap.Add(packType, tmpHandler); } packTypeMap[packType] += handler; }
public bool UnRegEvtHandler(WazSession s, Type packType, Action <object> handler) { Dictionary <Type, Action <object> > packTypeMap; if (!mPackDispatchMap.TryGetValue(s.Handle, out packTypeMap)) { return(false); } Action <object> tmpHandler; if (!packTypeMap.TryGetValue(packType, out tmpHandler)) { return(false); } packTypeMap[packType] -= handler; return(true); }
public override void Send(WazSession session, byte[] data, bool copyData) { byte[] dataToSend = data; if (copyData) { dataToSend = new byte[data.Length]; Array.Copy(data, dataToSend, data.Length); } //mSendPasser.MainThread_Pass(dataToSend); try { mSock.Send(dataToSend); //mSock.BeginSend(dataToSend, 0, dataToSend.Length, SocketFlags.None,null, null); } catch (Exception e) { Console.WriteLine(e); } }
public virtual void CloseSession(WazSession s) { }
public virtual void Send(WazSession session, byte[] data, bool copyData) { }
void SendData(WazSession waz) { mP.RegPack(typeof(CS_RequestUserID)); mP.RegPack(typeof(SC_AllocUserID)); mP.RegPack(typeof(CS_GamePlayerLogin)); mP.RegPack(typeof(CS_GamePlayerLogout)); mP.RegPack(typeof(CS_RequestRank)); mP.RegPack(typeof(SC_ResponRank)); mP.RegPack(typeof(CS_CommitScore)); mP.RegPack(typeof(SC_RewardDaily)); mP.RegPack(typeof(CS_PayNotify)); mP.RegPack(typeof(CS_RequestChangeName)); mP.RegPack(typeof(SC_RequestChangeNameResp)); CS_RequestUserID RegID; // RegID.MachineID = 1; // RegID.MachineID = (SystemInfo.deviceUniqueIdentifier); ///Debug.Log(Moudle_FileRead.GameID.Val); if (Moudle_FileRead.GameFirstRun.Val == true) { RegID.MachineID = SystemInfo.deviceUniqueIdentifier; RegID.Resolution = Screen.currentResolution.width.ToString() + "*" + Screen.currentResolution.height.ToString(); mP.Send(session, RegID); } else { // Debug.Log("不是第一次登录"); CS_GamePlayerLogin id; id.UserID = Moudle_FileRead.GameID.Val; //id.UserID = 21; // Debug.Log(id.UserID); mP.Send(session, id); } }
public override void CloseSession(WazSession s) { //mSock.Shutdown(SocketShutdown.Both); mSock.Close(); }
void Handle_SessionClose(WazSession s) { mSessionRecHelpers.Remove(s.Handle); }
void Handle_ReceivePack(WazSession s, object pack) { if (Moudle_FileRead.GameFirstRun.Val == true) { if (pack.GetType() == typeof(SC_AllocUserID)) { // Debug.Log("第一次运行玩家登录成功"); SC_AllocUserID Receive = (SC_AllocUserID)pack; // Debug.Log(Receive.UserID); CS_GamePlayerLogin id; id.UserID = Receive.UserID; // id.UserID = 21; mP.Send(session, id); if (Moudle_FileRead.GameID.Val == uint.MaxValue) { Moudle_FileRead.GameID.Val = id.UserID; } Moudle_FileRead.GameFirstRun.Val = false; } } if(pack.GetType()==typeof(SC_RewardDaily)) { bEveryDayReward = true; // Debug.Log("每日奖励"); Moudle_FileRead.EveryRewardDays.Val++; //Moudle_FileRead.EveryRewardDays.Val = Moudle_FileRead.EveryRewardDays.Val%7 + 1; //Debug.Log(Moudle_FileRead.EveryRewardDays.Val); if (Moudle_FileRead.EveryRewardDays.Val > 7) { Moudle_FileRead.EveryRewardDays.Val = 1; } //Debug.Log(Moudle_FileRead.EveryRewardDays.Val++); } if (pack.GetType() == typeof(SC_ResponRank)) { SC_ResponRank Receive = (SC_ResponRank)pack; //Debug.Log("当前排名"+Receive.Rank); SetRank(Receive.Rank); switch (Receive.Rank) { case 1: // Debug.Log("第一名"); RankData[0] = MobileInterface.GetPlayerScore(); RankName[0] = Receive.Name; RankData[1] = Receive.RankOffsetN1; RankName[1] = Receive.RankNameOffsetN1; RankData[2] = Receive.RankOffsetN2; RankName[2] = Receive.RankNameOffsetN2; break; case 2: RankData[0] = Receive.RankOffset1; RankName[0] = Receive.RankNameOffset1; RankData[1] = MobileInterface.GetPlayerScore(); RankName[1] = Receive.Name; RankData[2] = Receive.RankOffsetN1; RankName[2] = Receive.RankNameOffsetN1; RankData[3] = Receive.RankOffsetN2; RankName[3] = Receive.RankNameOffsetN2; break; default: RankData[0] = Receive.RankOffset2; RankName[0] = Receive.RankNameOffset2; RankData[1] = Receive.RankOffset1; RankName[1] = Receive.RankNameOffset1; RankData[2] = MobileInterface.GetPlayerScore(); RankName[2] = Receive.Name; RankData[3] = Receive.RankOffsetN1; RankName[3] = Receive.RankNameOffsetN1; RankData[4] = Receive.RankOffsetN2; RankName[4] = Receive.RankNameOffsetN2; break; } if (Module_Rank.EvtR != null)//+= Data_Finish; Module_Rank.EvtR(); } if (pack.GetType() == typeof(SC_RequestChangeNameResp)) { SC_RequestChangeNameResp resp = (SC_RequestChangeNameResp)pack; if (resp.Result) { CS_CommitScore iscore; iscore.score = MobileInterface.GetPlayerScore(); mP.Send(session, iscore); //Debug.Log("请求排行榜"); CS_RequestRank rank; mP.Send(session, rank); // Debug.Log("改名成功"); Moudle_FileRead.FirstChangeName.Val = false; Module_Rank.SetRank(); Module_Rank.go_Rank.transform.FindChild("改名字").gameObject.SetActive(false); //go_Rank.SetActive(false); Moudle_main.Singlton.go_Black.SetActive(false); } } }
public bool Send(WazSession s, object data) { Packable packAttr = (Packable)Attribute.GetCustomAttribute(data.GetType(), typeof(Packable)); if (packAttr == null) return false; int sizePackOffsetLen = sizeof(PackageOffsetToEnd); try { //序列化 FieldInfo[] members = data.GetType().GetFields(); mMemSendStream.Position = 0; mMemSendStream.SetLength(0); mBinWriter.Write(mPackHead); long posPackLen = mMemSendStream.Position; //留空位给等下回来写包长度 mBinWriter.Seek(sizePackOffsetLen, SeekOrigin.Current); mBinWriter.Write(packAttr.ID); foreach (FieldInfo f in members) { object o = f.GetValue(data); WazSerializerHelper.Write(mBinWriter, o); } PackageOffsetToEnd offsetToEnd = (PackageOffsetToEnd)(mMemSendStream.Position - posPackLen - sizePackOffsetLen); mBinWriter.Write(mPackEnd); mBinWriter.Seek((int)posPackLen, SeekOrigin.Begin); mBinWriter.Write(offsetToEnd); mNetwork.Send(s, mMemSendStream.ToArray()); return true; } catch { return false; } }
void Handle_RecivePackage(WazSession s, byte[] data, int size) { PackRecHelper recHelper; if (!mSessionRecHelpers.TryGetValue(s.Handle, out recHelper)) return; //将data 放入读取stream末尾 recHelper.Stream.Write(data, 0, size); recHelper.Stream.Seek(recHelper.PreReadStreamOffset, SeekOrigin.Begin); bool havePackageCut = false; //开始读取. while (recHelper.Stream.Position < recHelper.Stream.Length - 1) { long posStartRead = recHelper.Stream.Position; object objPack; Type typePack; try { //读包头 byte head = recHelper.Reader.ReadByte(); if (head != mPackHead) continue; //读长度(实际为到包尾offset) PackageOffsetToEnd offsetToEnd = recHelper.Reader.ReadUInt16(); //判断超出当前流(一个包在两段流中) if (recHelper.Stream.Position + offsetToEnd + 1 > recHelper.Stream.Length) { recHelper.PreReadStreamOffset = posStartRead; havePackageCut = true; break; } //判断包尾是否正确 long posTmp = recHelper.Stream.Position; recHelper.Stream.Seek(offsetToEnd, SeekOrigin.Current); byte end = recHelper.Reader.ReadByte(); recHelper.Stream.Position = posTmp;//还原pos到读位置之后 if (end != mPackEnd) continue; //读命令id PackageID pID = recHelper.Reader.ReadUInt16(); if (!mPackageMap.TryGetValue(pID, out typePack)) { Debug.WriteLine("[erro]解析包时出现未注册包ID"); continue; } //正式开始数据 objPack = Activator.CreateInstance(typePack); FieldInfo[] packFields = typePack.GetFields(); foreach (FieldInfo f in packFields) { f.SetValue(objPack, WazSerializerHelper.Read(recHelper.Reader, f.FieldType)); } //跳过包尾 recHelper.Stream.Seek(1, SeekOrigin.Current); } catch (Exception e) { // recHelper.PreReadStreamOffset = posStartRead; // havePackageCut = true; Debug.WriteLine("[erro]接收数据包异常.可能出现错误包 \r\n" + e.ToString()); break; } if (objPack != null) { if (EvtRecevicePack != null) EvtRecevicePack(s, objPack); //触发pack绑定处理函数 Action<WazSession, object> packBindHanlders; if (mPackDispathToAllSessionMap.TryGetValue(typePack, out packBindHanlders)) { packBindHanlders(s, objPack); } //触发session,pack绑定处理函数 Dictionary<Type, Action<object>> typePackMap; if (mPackDispatchMap.TryGetValue(s.Handle, out typePackMap)) { Action<object> handler; if (typePackMap.TryGetValue(typePack, out handler)) { handler(objPack); } } } } //证明完成读包,重置缓冲区 if (!havePackageCut) { recHelper.PreReadStreamOffset = 0; recHelper.Stream.Position = 0; recHelper.Stream.SetLength(0); } }
public virtual void Send(WazSession session, byte[] data) { }
void Handle_SessionAccept(WazSession s) { mSessionRecHelpers.Add(s.Handle, new PackRecHelper()); }
void Handle_RecivePackage(WazSession s, byte[] data, int size) { PackRecHelper recHelper; if (!mSessionRecHelpers.TryGetValue(s.Handle, out recHelper)) { return; } //将data 放入读取stream末尾 recHelper.Stream.Write(data, 0, size); recHelper.Stream.Seek(recHelper.PreReadStreamOffset, SeekOrigin.Begin); bool havePackageCut = false; //开始读取. while (recHelper.Stream.Position < recHelper.Stream.Length - 1) { long posStartRead = recHelper.Stream.Position; object objPack; Type typePack; try { //读包头 byte head = recHelper.Reader.ReadByte(); if (head != mPackHead) { continue; } //读长度(实际为到包尾offset) PackageOffsetToEnd offsetToEnd = recHelper.Reader.ReadUInt16(); //判断超出当前流(一个包在两段流中) if (recHelper.Stream.Position + offsetToEnd + 1 > recHelper.Stream.Length) { recHelper.PreReadStreamOffset = posStartRead; havePackageCut = true; break; } //判断包尾是否正确 long posTmp = recHelper.Stream.Position; recHelper.Stream.Seek(offsetToEnd, SeekOrigin.Current); byte end = recHelper.Reader.ReadByte(); recHelper.Stream.Position = posTmp;//还原pos到读位置之后 if (end != mPackEnd) { continue; } //读命令id PackageID pID = recHelper.Reader.ReadUInt16(); if (!mPackageMap.TryGetValue(pID, out typePack)) { Debug.WriteLine("[erro]解析包时出现未注册包ID"); continue; } //正式开始数据 objPack = Activator.CreateInstance(typePack); FieldInfo[] packFields = typePack.GetFields(); foreach (FieldInfo f in packFields) { f.SetValue(objPack, WazSerializerHelper.Read(recHelper.Reader, f.FieldType)); } //跳过包尾 recHelper.Stream.Seek(1, SeekOrigin.Current); } catch (Exception e) { // recHelper.PreReadStreamOffset = posStartRead; // havePackageCut = true; Debug.WriteLine("[erro]接收数据包异常.可能出现错误包 \r\n" + e.ToString()); break; } if (objPack != null) { if (EvtRecevicePack != null) { EvtRecevicePack(s, objPack); } //触发pack绑定处理函数 Action <WazSession, object> packBindHanlders; if (mPackDispathToAllSessionMap.TryGetValue(typePack, out packBindHanlders)) { packBindHanlders(s, objPack); } //触发session,pack绑定处理函数 Dictionary <Type, Action <object> > typePackMap; if (mPackDispatchMap.TryGetValue(s.Handle, out typePackMap)) { Action <object> handler; if (typePackMap.TryGetValue(typePack, out handler)) { handler(objPack); } } } } //证明完成读包,重置缓冲区 if (!havePackageCut) { recHelper.PreReadStreamOffset = 0; recHelper.Stream.Position = 0; recHelper.Stream.SetLength(0); } }
public override void Send(WazSession session, byte[] data) { Send(session, data, false); }
public bool UnRegEvtHandler(WazSession s, Type packType, Action<object> handler) { Dictionary<Type, Action<object>> packTypeMap; if (!mPackDispatchMap.TryGetValue(s.Handle, out packTypeMap)) { return false; } Action<object> tmpHandler; if (!packTypeMap.TryGetValue(packType, out tmpHandler)) { return false; } packTypeMap[packType] -= handler; return true; }
/// <summary> /// 注册指定session,包触发的处理函数 /// </summary> /// <param name="s">S.</param> /// <param name="packType">Pack type.</param> /// <param name="handler">Handler.</param> public void RegEvtHandler(WazSession s, Type packType, Action<object> handler) { Dictionary<Type, Action<object>> packTypeMap; if (!mPackDispatchMap.TryGetValue(s.Handle, out packTypeMap)) { packTypeMap = new Dictionary<Type, Action<object>>(); mPackDispatchMap.Add(s.Handle, packTypeMap); } Action<object> tmpHandler; if (!packTypeMap.TryGetValue(packType, out tmpHandler)) { packTypeMap.Add(packType, tmpHandler); } packTypeMap[packType] += handler; }
IEnumerator ConnectToInternet() { while (true) { //Debug.Log("每十秒连一下"); if (!mC.IsConnect()) session = mC.Connect(IP_ADDRESS, 9873); if (mC.IsConnect()) { CS_CommitScore iscore; iscore.score = MobileInterface.GetPlayerScore(); mP.Send(session, iscore); } else { } yield return new WaitForSeconds(10.0f); } }