コード例 #1
0
 /// <summary>
 /// Add new message to log
 /// </summary>
 /// <param name="message"></param>
 public void AddToLog(HttpMessage message)
 {
     HandledMessages.Add(message);
     Log.Add(new ListBoxItem {
         Content = message.FirstLine
     });
 }
コード例 #2
0
 protected override void Handle(int clientId, T message)
 {
     HandledMessages.Add(message);
 }
コード例 #3
0
 public void Handle(TestMessage message)
 {
     HandledMessages.Add(message);
 }
コード例 #4
0
 public void Handle(GrandChildTestMessage message)
 {
     HandledMessages.Add(message);
 }
コード例 #5
0
        /// <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();
                }
            }
        }