示例#1
0
        private void DoConnectionLost(ConnectionLostEventArgument argument, data sender)
        {
            var rest = new List <PrimaryMessage>();

            DoConnectionLost(argument);
            if (argument.Retry)
            {
                rest.AddRange(sender.messages);
            }
            Connections.Remove(sender.con);
            if (argument.Retry)
            {
                if (Manager != null && Manager.DefaultLogin is LoginClient2)
                {
                    var lc = Manager.DefaultLogin as LoginClient2;
                    lc.Connect(sender.con.Target);
                }
            }
            if (Manager != null)
            {
                var user = Manager.Users.Users.Find((u) => u.DefaultConnector == base.ConnectorId);
                if (user != null)
                {
                    user.Ping = -1;
                    if (argument.UserLogout)
                    {
                        Manager.Users.RemoveUser(user);
                        if (UserLogedOut != null)
                        {
                            UserLogedOut(new LogoutUser(user, this, argument));
                        }
                    }
                }
            }
        }
示例#2
0
        private void DoConnectionLost(ConnectionLostEventArgument argument, data sender)
        {
            var rest = new List <PrimaryMessage>();

            DoConnectionLost(argument);
            if (argument.Retry)
            {
                while (sender.messages.Count > 0)
                {
                    rest.Add(sender.messages.Dequeue());
                }
            }
            ConnectionRemoved(sender.con);
            //if (argument.Retry)
            //{
            //    ConnectionAdded(sender.con);
            //    var d = datas.Find((dt) => dt.con == sender.con);
            //    if (argument.SendedMessage != null&&argument.SendedMessage is PrimaryMessage)
            //        d.messages.Enqueue(argument.SendedMessage as PrimaryMessage);
            //    for (int i = 0; i < rest.Count; ++i) d.messages.Enqueue(rest[i]);
            //}
            if (Manager != null)
            {
                var user = Manager.Users.Users.Find((u) => u.DefaultConnector == base.ConnectorId);
                if (user != null)
                {
                    user.Ping = -1;
                    if (argument.UserLogout)
                    {
                        Manager.Users.RemoveUser(user);
                        if (UserLogedOut != null)
                        {
                            var lu = new LogoutUser(user, this, argument);
                            UserLogedOut(lu);
                        }
                    }
                }
            }
        }
示例#3
0
 void doCont()
 {
     using (var stream = tcp.GetStream())
         while (active)
         {
             if (!tcp.Connected)
             {
                 cl = new ConnectionLostEventArgument(datatr, con, null);
                 return;
             }
             DoPing();
             while (tcp.Available > 0)
             {
                 var data = ConnectionHelper.Receive2(stream);
                 try
                 {
                     var mes = new PrimaryMessage();
                     mes.Load(data);
                     mes.MessageRoot.Connection = con;
                     mes.MessageRoot.Connector  = connector;
                     mes.MessageRoot.RemoteId   = id;
                     var task = new Task(() => Manager.ReceiveMessage(mes));
                     task.Start();
                 }
                 catch
                 {
                     if (tcp.Connected)
                     {
                         continue;
                     }
                     else
                     {
                         cl = new ConnectionLostEventArgument(datatr, con, null);
                         return;
                     }
                 }
             }
             while (messages.Count > 0)
             {
                 var mes = messages.Dequeue();
                 if (mes == null)
                 {
                     continue;
                 }
                 if (!tcp.Connected)
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, mes);
                     return;
                 }
                 mes.SenderID = Manager.CurrentId.Id;
                 try { ConnectionHelper.Send2(stream, mes); }
                 catch
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, mes);
                     return;
                 }
             }
             if (active)
             {
                 if (!tcp.Connected)
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, null);
                     return;
                 }
                 Thread.Sleep(10);
             }
         }
 }
示例#4
0
 public LogoutUser(User user, Connector connector, ConnectionLostEventArgument argument)
 {
     User      = user;
     Connector = connector;
     Argument  = argument;
 }
示例#5
0
 void doConct(TcpClient tcp)
 {
     using (var stream = tcp.GetStream())
         while (active)
         {
             if (!tcp.Connected)
             {
                 cl = new ConnectionLostEventArgument(datatr, con, null);
                 return;
             }
             DoPing();
             while (tcp.Available > 0)
             {
                 var l = new List <byte>();
                 var b = new byte[tcp.ReceiveBufferSize];
                 int len;
                 while (true)
                 {
                     len = stream.Read(b, 0, b.Length);
                     l.AddRange(b.ToList().GetRange(0, len).ToArray());
                     if (len < b.Length)
                     {
                         break;
                     }
                 }
                 try
                 {
                     var mes = new PrimaryMessage();
                     mes.Load(l.ToArray());
                     mes.MessageRoot.Connection = con;
                     mes.MessageRoot.Connector  = connector;
                     mes.MessageRoot.RemoteId   = id;
                     Manager.ReceiveMessage(mes);
                 }
                 catch
                 {
                     if (tcp.Connected)
                     {
                         continue;
                     }
                     else
                     {
                         cl = new ConnectionLostEventArgument(datatr, con, null);
                         return;
                     }
                 }
             }
             while (messages.Count > 0)
             {
                 var mes = messages.Dequeue();
                 if (mes == null)
                 {
                     continue;
                 }
                 if (!tcp.Connected)
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, mes);
                     return;
                 }
                 mes.SenderID = Manager.CurrentId.Id;
                 var b = mes.Save();
                 try
                 {
                     stream.Write(b, 0, b.Length);
                 }
                 catch
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, mes);
                     return;
                 }
             }
             if (active)
             {
                 if (!tcp.Connected)
                 {
                     cl = new ConnectionLostEventArgument(datatr, con, null);
                     return;
                 }
                 Thread.Sleep(10);
             }
         }
 }