using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using CommonNetwork_ICE.Util; using CommonNetwork_ICE.Common; using Slice; using CommonLang.Log; namespace CommonNetwork_ICE.Msg { /// /// 客户端消息包循环发送处理类 /// public class ClientMessageQueue { private static Logger log = LoggerFactory.GetLogger("ClientMessageQueue"); // 待发送消息队列 private static Queue queue = new Queue(); // 消息队列绑定线程 private Thread thread; // 是否运行线程 private bool runFlag; // 发送的数据包序列号 private long sentSerial; // 超时时间 private int timeout = Env.SEND_WAIT_ACK_TIME_OUT; public ClientMessageQueue() { this.sentSerial = 0; this.LastSerial = 0; } // 发送接口 public IceConnector Connector { get; set; } // 服务器返回的数据包序列号 public long LastSerial { set; get; } public void Start() { thread = new Thread(Run); runFlag = true; thread.Start(); } public void End() { runFlag = false; if (thread != null) { thread.Join(); thread.Abort(); } } /// /// 加入新消息 /// /// public void AddMessage(TransMessage message) { queue.Enqueue(message); } /// /// 消息发送 /// private void Run() { TransMessage preMessage = null; DateTime preDateTime = DateTime.Now; while (runFlag || queue.Count > 0) { try { // 当前发送数据包的应答序号号未收到 if (sentSerial != LastSerial) { // 是否在发送超时时间内 if (preDateTime.AddSeconds(timeout) < DateTime.Now) { if (preMessage != null) { try { Connector.Sender.SendData(Connector.GetConnectorConfig().LocalPort, preMessage); } catch (Exception e) { log.Error("客户端重发数据错误:" + e.Message); continue; } log.Trace("没收到关键包应答,客户端重发数据:" + preMessage.serial); preDateTime = DateTime.Now; } continue; } else { log.Trace("没收到关键包应答,等待当前序列号数据包:" + sentSerial); Thread.Sleep(Env.SEND_WAIT_ACT_THREAD_SLEEP_TIME); continue; } } if (queue.Count > 0) { // 发送数据包 TransMessage outMessage = queue.Dequeue(); try { Connector.Sender.SendData(Connector.GetConnectorConfig().LocalPort, outMessage); } catch (Exception e) { log.Error("消息循环发送数据错误:" + e.Message); continue; } preDateTime = DateTime.Now; // 如果是关键数据包,记录序列号,进入下一个发送周期 if (outMessage.type == Constants.PACKET_HINGE) { sentSerial = outMessage.serial; preMessage = outMessage; } } } catch (Exception err) { log.Error(err.Message, err); } } } } }