예제 #1
0
 void BroadcastLogin()
 {
     System.Threading.Tasks.Task.Factory.StartNew(() =>
     {
         foreach (var v in lstUser)
         {
             var qmu = v.Value;
             var qc  = TryConnectUser(qmu);
             if (qc != null)
             {
                 var c      = new QcChanel();
                 qmu.Chanel = c;
                 c.SetChanel(qc, qc);
                 c.ReceivedCmd         += serverchanel_ReceivedCmd;
                 qc.DisConnectedServer += (o, e) => {
                     if (this.Loginout != null)
                     {
                         var evtarg = new QcMessagerLoginEventArg(qmu);
                         qmu.Chanel = null;
                         this.Loginout(this, evtarg);
                     }
                 };
             }
         }
     });
 }
예제 #2
0
        void server_ReceiveCmd(object sender, QcCmdEventArgs e)
        {
            QcCmd  cmd  = e.Cmd;
            string from = e.Cmd.tokens(1);

            switch (cmd.CmdType)
            {
            case QcProtocol.QcCommand.QcUserLogin:

                bool blLogined = false;
                if (cmd.tokens(2) == User.Name)
                {
                    blLogined = true;
                    QcChanel chanel = new QcChanel();

                    chanel.SetChanel(e.Chanel, server);

                    if (lstUser.ContainsKey(from))
                    {
                        lstUser[from].Chanel = chanel;
                        if (this.Logined != null)
                        {
                            var userfrom = lstUser[from];
                            var evtarg   = new QcMessagerLoginEventArg(userfrom);
                            this.Logined(this, evtarg);
                        }
                    }
                }

                QcClientService qcs = e.Chanel as QcClientService;
                e.Chanel.Send(QcCmd.MakeCmd(QcProtocol.QcCommand.QcLoginReplay, blLogined));
                if (blLogined && from != User.Name)
                {
                    e.Chanel.Send(QcCmd.MakeCmd(QcProtocol.QcCommand.QcUserLogin, User.Name, from));
                }

                break;
            }
        }
예제 #3
0
 void server_ClientClosed(object sender, System.Net.Sockets.SocketAsyncEventArgs e)
 {
     if (this.Loginout != null)
     {
         foreach (var v in lstUser)
         {
             if (v.Value.Socket is QcClientService)
             {
                 var socket = v.Value.Socket;
                 if (socket != null)
                 {
                     var qcs = socket as QcClientService;
                     if (qcs.ID == e.AcceptSocket.ToString())
                     {
                         var evt = new QcMessagerLoginEventArg(v.Value);
                         v.Value.Chanel = null;
                         this.Loginout(this, evt);
                     }
                 }
             }
         }
     }
 }
예제 #4
0
        void serverchanel_ReceivedCmd(object sender, QcCmdEventArgs e)
        {
            // 这是登录服务器,首次登陆,没有创建连接对象
            if (lstUser.ContainsKey(e.Cmd.tokens(1)) == false)
            {
                return;
            }
            var userfrom = lstUser[e.Cmd.tokens(1)];

            if (userfrom == null)
            {
                return;
            }
            switch (e.Cmd.CmdType)
            {
            case QcProtocol.QcCommand.QcMsg:
                if (this.ReciveMsg != null)
                {
                    var msgevtarg = new QcMessagerMsgEventArg(e.Cmd.tokens(1), e.Cmd.tokens(3), e.Cmd.tokens(4));
                    this.ReciveMsg(this, msgevtarg);
                }
                break;

            case QcProtocol.QcCommand.QcLoginReplay:
                break;

            case QcProtocol.QcCommand.QcLoginOut:

                if (this.Loginout != null)
                {
                    var evt = new QcMessagerLoginEventArg(userfrom);
                    this.Loginout(this, evt);
                }
                userfrom.Close();
                break;

            case QcProtocol.QcCommand.QcUserLogin:
                if (sender == serverchanel)
                {
                    return;
                }
                if (userfrom.Name == User.Name)
                {
                    return;
                }
                bool blLogined = false;
                if (e.Cmd.tokens(2) == User.Name)
                {
                    blLogined = true;
                    if (this.Logined != null)
                    {
                        var evtarg = new QcMessagerLoginEventArg(userfrom);
                        this.Logined(this, evtarg);
                    }
                }
                e.Chanel.Send(QcCmd.MakeCmd(QcProtocol.QcCommand.QcLoginReplay, blLogined));
                break;
            }
            if (this.ReciveCmd != null)
            {
                var cmdevt = new QcMessagerCmdEventArg()
                {
                    cmd = e.Cmd, user = userfrom
                };
                this.ReciveCmd(this, cmdevt);
            }
        }