/// <summary> /// 消息处理的核心分发过程。 /// </summary> /// <param name="args">处理时需要的信息。</param> private void HandleMessage(HandleMessageArgs args) { Logger.Log("KClient::HandleMessage() from " + args.Message.Header.SourceEndPoint.ToString() + " with code " + args.Message.Header.Code.ToString()); // 确保不是自己发出的消息 if (!args.Message.Header.SourceEndPoint.Equals(_localKEndPoint)) { KHandledMessage handledMessage; int handledMessageIndex; handledMessage = HandledMessages.FindHandledMessage(args.Message, out handledMessageIndex); string tmpLog; tmpLog = "消息代码: " + args.Message.Header.Code.ToString(); tmpLog += Environment.NewLine + "消息唯一编码: " + args.Message.Header.MessageID.ToString(); tmpLog += Environment.NewLine + "消息来源: " + args.Message.Header.SourceEndPoint.ToString(); Logger.Log(tmpLog); // 若未处理过该消息 if (handledMessage == null) { Logger.Log("未处理过该消息。"); switch (args.Message.Header.Code) { case KMessageCode.ReportAlive: if (!args.Message.Header.SourceEndPoint.AddressEquals(IPAddress.Loopback)) { HandleReportAlive(args); AddToConnectionList(args.Message.Header.SourceEndPoint); } break; case KMessageCode.ClientEnterNetwork: HandleClientEnterNetwork(args); if (args.RealPort == 0) { // 这条消息是用来连接到接入点的,此时对方还未初始化完毕,所以不用判断源端点的事情 AddToConnectionList(KEndPoint.FromEndPoint(args.EndPoint)); } else { // 这是接入点连接到接入点的请求 // 此时地址是真实的,监听端口由 args.RealPort 反映 var kep = KEndPoint.FromEndPoint(args.EndPoint); kep.SetPort(args.RealPort); AddToConnectionList(kep); } break; case KMessageCode.ClientExitNetwork: if (!args.Message.Header.SourceEndPoint.AddressEquals(IPAddress.Loopback)) { HandleClientExitNetwork(args); // 既然退出了为什么还要保留这个项 //AddToConnectionList(args.Message.Header.SourceEndPoint); } break; case KMessageCode.PeerEnterNetwork: if (!args.Message.Header.SourceEndPoint.AddressEquals(IPAddress.Loopback)) { HandlePeerEnterNetwork(args); AddToConnectionList(args.Message.Header.SourceEndPoint); } break; case KMessageCode.PeerExitNetwork: if (!args.Message.Header.SourceEndPoint.AddressEquals(IPAddress.Loopback)) { HandlePeerExitNetwork(args); AddToConnectionList(args.Message.Header.SourceEndPoint); } break; case KMessageCode.GotPeer: if (!args.Message.Header.SourceEndPoint.AddressEquals(IPAddress.Loopback)) { HandleGotPeer(args); AddToConnectionList(args.Message.Header.SourceEndPoint); } break; default: return; } Logger.Log("将消息加入“已处理”列表。"); // 对于收到的信息,都加入“已处理消息”列表 lock (HandledMessages) { HandledMessages.Add(new KHandledMessage(args.Message)); } } else { Logger.Log("更新消息生命周期。"); // 更新生命周期,并将其移动到列表最后(因为是“刚刚加入”的) handledMessage.LifeStart = DateTime.Now; lock (HandledMessages) { // 访问这个过程的只有一个线程,所以不用担心说前面某一项先被移动到后面去了导致索引错误 HandledMessages.RemoveAt(handledMessageIndex); HandledMessages.Add(handledMessage); } Logger.Log("清理“已处理”列表。"); SweepHandledMessages(); } } }