public void Send(Packet packet, bool isAgain = false, bool isAck = false) { if (!isAck) { object[] objs = packet.GetType().GetCustomAttributes(typeof(PacketAttribute), false); if (objs.Length > 0) { if (!isAgain) { // 如果不是再次发送则添加进已经发送队列, // 已经发送的数据已经在队列中,无需重复添加。 Interlocked.Increment(ref SendSN); packet.sn = SendSN; BeenSent.Add(packet); } PacketAttribute oAttr = objs[0] as PacketAttribute; packet.token = oAttr.Token; } packet.ack = 0; // 设置不是回包 } else { packet.ack = 1; } packet.wait = 0; // 包超时重置 if (!string.IsNullOrEmpty(packet.token)) { string json = JsonUtility.Encode(packet); byte[] bytes = Encoding.UTF8.GetBytes(json); SendClient.Send(bytes, bytes.Length, mSendPoint); } }
private void Recv(string msg) { // 解析包Token Packet packet = JsonUtility.Decode <Packet>(msg); if (packet.ack == 0) { // 收到新的数据包后发送回包 Send(packet, false, true); bool isNew = true; // 判断是否新的数据包 // 接收到的序号 if (packet.sn >= RecvSN + 1) { // 说明: // 1.序号等于现有序号加一说明没有跳包正常接收. // 2.序号大于现有序号加一说明存在丢包,把丢失的包信息保存起来. // 添加丢失的包序号 long recv = RecvSN + 1; long recvsn = packet.sn; for (long i = recv; i < recvsn; i++) { LostRecv.Add(i); } // 当前接收到的包的序号 RecvSN = packet.sn; } else { // 说明:当回包验证没法完成时,客户端会重新发包,这时如果已经处理了该包则不用再次处理! // 接收到的序号小于等于现有序号表示该数据包已经接收过或上回丢失的数据包。 long recv = -1; recv = LostRecv.Find((it) => it == packet.sn); // 没有找到丢失的包序号则判定该包是客户端重复发送的数据包 if (recv == -1) { isNew = false; } } if (isNew) { // 处理新包 Packet newPacket = PakcetFactory.Create(packet.token, msg); if (newPacket != null) { PacketProcess.Process(newPacket); } } } else { // 收到回包后删除发送成功的数据包 BeenSent.RemoveAll((it) => it.sn == packet.sn); } }