/// <summary> /// 自由线程,检测未发送的数据并发出,存在其中的就是没有收到确认包的数据包 /// </summary> void CheckUnConfirmedQueue() { do { if (sendlist.Count > 0) { UdpPacket[] array = null; lock (sendlist) { array = sendlist.ToArray(); } //挨个重新发送并计数 Array.ForEach(array, s => { s.sendtimes++; if (s.sendtimes >= MaxResendTimes) { //sOnPackageSendFailure//出发发送失败事件 sendlist.Remove(s);//移除该包 } else { //重新发送 byte[] udpPacketDatagram = SerializationUnit.SerializeObject(s); client.Send(udpPacketDatagram, udpPacketDatagram.Length, s.remoteip); } }); } Thread.Sleep(CheckQueueTimeInterval);//间隔一定时间重发数据 } while (true); }
/// <summary> /// 同步发送分包数据 /// </summary> /// <param name="message"></param> public void SendData(Msg message) { ICollection <UdpPacket> udpPackets = UdpPacketSplitter.Split(message); foreach (UdpPacket udpPacket in udpPackets) { byte[] udpPacketDatagram = SerializationUnit.SerializeObject(udpPacket); this.client.Connect(udpPacket.remoteip); //使用同步发送 client.Send(udpPacketDatagram, udpPacketDatagram.Length, udpPacket.remoteip); if (udpPacket.IsRequireReceiveCheck) { PushSendItemToList(udpPacket);//将该消息压入列表 } } }
public static ICollection <UdpPacket> Split(Msg message) { byte[] datagram = null; try { datagram = SerializationUnit.SerializeObject(message); } catch (Exception e) { //AddTalkMessage("数据转型异常"); } //产生一个序列号,用来标识包数据属于哪一组 Random Rd = new Random(); long SequenceNumber = Rd.Next(88888, 999999); ICollection <UdpPacket> udpPackets = UdpPacketSplitter.Split(SequenceNumber, datagram, 10240, message.destinationIP, message.port); return(udpPackets); }
/// <summary> /// 异步分包发送数组的方法 /// </summary> /// <param name="message"></param> public void AsyncSendData(Msg message) { ICollection <UdpPacket> udpPackets = UdpPacketSplitter.Split(message); this.client.Connect(udpPackets.FirstOrDefault().remoteip); foreach (UdpPacket udpPacket in udpPackets) { byte[] udpPacketDatagram = SerializationUnit.SerializeObject(udpPacket); //使用同步发送 //client.Send(udpPacketDatagram, udpPacketDatagram.Length); //使用异步的方法发送数据 this.client.BeginSend(udpPacketDatagram, udpPacketDatagram.Length, new AsyncCallback(SendCallback), null); //Thread.Sleep(10); } }
//把这个对象生成byte[] public byte[] ToArray() { return(SerializationUnit.SerializeObject(this)); }