protected void CallBack(MessageHead head, RecvData recv) { int key = head.CmdAct; if (head.error == Error.ErrNetTimeout) { } if (foreverCallbackDict.ContainsKey(key)) { foreverCallbackDict[key](head.error, recv); } if (foreverCallbackDict.ContainsKey(head.cmd)) { foreverCallbackDict[head.cmd](head.error, recv); } if (indexDict.ContainsKey(head.index)) { indexDict.Remove(head.index); } if (onceCallbackDict.ContainsKey(head.index)) { onceCallbackDict[head.index](head.error, recv); } }
public RecvData(MessageHead head, byte[] data) { this.head = head; this.data = data; int key = head.cmd * 1024 + head.act; if (parseDict.ContainsKey(key)) { parseDict[key](this); } }
protected void OnRecvHead() { int read = tcpClient.GetStream().EndRead(asyncReader); byte[] data = (byte[])asyncReader.AsyncState; asyncReader.AsyncWaitHandle.Close(); asyncReader = null; if (read > 0) { totalRead += read; if (totalRead == MessageHead.Length) { totalRead = 0; head = MessageHead.Parse(data); if (head.error > 0) { if (head.error != Error.ErrOk) { if (onRecvError != null) { onRecvError(head.error); } Log.Warn("服务器返回错误码 : {0}", head.error); } } if (head.len > MessageHead.MaxRecvLength) { Stop(false); disconnCallback(this); return; } if (head.len == 0) { CallBack(head, new RecvData(head)); head = null; } ProcessRecv(); } else { asyncReader = tcpClient.GetStream().BeginRead(data, totalRead, MessageHead.Length - totalRead, null, data); } } else if (read == 0) { Stop(false); disconnCallback(this); } }
/// <summary> /// 解析协议头 /// </summary> /// <param name="data">数据</param> /// <returns>解析好的协议头</returns> public static MessageHead Parse(byte[] data) { MessageHead head = new MessageHead(); MemoryStream stream = new MemoryStream(data); BinaryReader reader = new BinaryReader(stream); head.len = reader.ReadUInt32(); head.error = reader.ReadUInt16(); head.cmd = reader.ReadByte(); head.act = reader.ReadByte(); head.index = reader.ReadUInt16(); head.flags = reader.ReadUInt16(); return(head); }
protected void OnRecvData() { int read = tcpClient.GetStream().EndRead(asyncReader); byte[] data = (byte[])asyncReader.AsyncState; asyncReader.AsyncWaitHandle.Close(); asyncReader = null; if (read > 0) { totalRead += read; if (totalRead == head.len) { totalRead = 0; uint oldlen = (head.flags & (ushort)MessageHead.Flags.FlagCompress) > 0 ? BitConverter.ToUInt32(data, 0) : 0; if (oldlen > 0) { byte[] xdata = new byte[oldlen]; GZipInputStream gzi = new GZipInputStream(new MemoryStream(data, 4, (int)head.len - 4)); gzi.Read(xdata, 0, xdata.Length); CallBack(head, new RecvData(head, xdata)); } else { CallBack(head, new RecvData(head, data)); } head = null; ProcessRecv(); } else { asyncReader = tcpClient.GetStream().BeginRead(data, totalRead, (int)(head.len - totalRead), null, data); } } else if (read == 0) { Stop(false); disconnCallback(this); } }
protected void ProcessRecv() { while (udpClient.Available > 0) { byte[] data = udpClient.Receive(ref serverAddr); MessageHead head = MessageHead.Parse(data); Log.Info("recv index:{0} needack:{1}", head.index, head.needAck); if (head.len == 0) { if (head.needAck) { SendMsg(new SendData(head.cmd, head.act, (ushort)(head.flags | (ushort)MessageHead.Flags.FlagAck), head.index)); } CallBack(head, new RecvData(head)); } else if (head.len <= MessageHead.MaxRecvLength) { uint oldlen = (head.flags & (ushort)MessageHead.Flags.FlagCompress) > 0 ? BitConverter.ToUInt32(data, MessageHead.Length) : 0; uint datalen = oldlen > 0 ? oldlen : head.len; byte[] xdata = new byte[datalen]; if (oldlen > 0) { GZipInputStream gzi = new GZipInputStream(new MemoryStream(data, MessageHead.Length + 4, (int)head.len - 4)); gzi.Read(xdata, 0, xdata.Length); } else { Array.Copy(data, MessageHead.Length, xdata, 0, datalen); } if (head.needAck) { SendMsg(new SendData(head.cmd, head.act, (ushort)(head.flags | (ushort)MessageHead.Flags.FlagAck), head.index)); } CallBack(head, new RecvData(head, xdata)); } } }
public override void Stop(bool destroy) { if (tcpClient != null) { StopAllCoroutines(); tcpClient.Close(); tcpClient = null; head = null; asyncWriter = null; asyncReader = null; asyncConnect = null; Log.Info("net close {0}", gameObject.name); } if (destroy) { Destroy(gameObject); Log.Info("net object destroy {0}", gameObject.name); } }
public RecvData(MessageHead head) { this.head = head; }
public RecvData() { head = new MessageHead(); }