Exemple #1
0
        /// <summary>
        ///     处理转发队列
        /// </summary>
        private void ProcessReceivedMsg(IUserToken userToken, Message msg)
        {
            _receiveSemaphore.WaitOne();
            try
            {
                if (msg != null)
                {
                    switch (msg.Protocal)
                    {
                    case (byte)MessageProtocalEnum.Heart:
                        msg.Accepter = msg.Sender;
                        SendHeart(msg);
                        break;

                    case (byte)MessageProtocalEnum.Login:
                        userToken.UID = msg.Accepter;
                        UserTokenList.SetByUID(userToken);
                        msg.Protocal = (byte)MessageProtocalEnum.RLogin;
                        msg.Data     = Encoding.UTF8.GetBytes("登录成功");
                        SendPrivateMsg(msg);
                        break;

                    case (byte)MessageProtocalEnum.Logout:
                        userToken.UID = msg.Accepter;
                        UserTokenList.DelByUID(userToken);
                        break;

                    case (byte)MessageProtocalEnum.Subscribe:
                        userToken.UID = msg.Sender;
                        UserTokenList.SetByChannelID(msg.Accepter, userToken);
                        msg.Protocal = (byte)MessageProtocalEnum.RSubscribe;
                        msg.Data     = Encoding.UTF8.GetBytes("订阅成功");
                        SendPrivateMsg(msg);
                        break;

                    case (byte)MessageProtocalEnum.Unsubscribe:
                        userToken.UID = msg.Accepter;
                        UserTokenList.DelByChannelID(msg.Accepter, userToken);
                        break;

                    case (byte)MessageProtocalEnum.Message:
                        SendChannelMsg(msg);
                        break;

                    case (byte)MessageProtocalEnum.PrivateMsg:
                        SendPrivateMsg(msg);
                        break;

                    case (byte)MessageProtocalEnum.File:
                        SendFile(msg);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                RaiseOnErrored(ex, userToken, msg);
            }
            _receiveSemaphore.Release();
        }
Exemple #2
0
        /// <summary>
        ///     服务器主动断开客户端连接
        /// </summary>
        /// <param name="e"></param>
        public void CloseClientSocket(SocketAsyncEventArgs e, string msg, Exception ex = null)
        {
            var userToken = e.UserToken as IUserToken;

            if (userToken != null)
            {
                if (userToken.ConnectSocket != null)
                {
                    if (userToken.ConnectSocket.Connected)
                    {
                        userToken.ConnectSocket.Shutdown(SocketShutdown.Both);
                        userToken.ConnectSocket.Close();
                    }
                }
                // 减少连接到服务器的客户端的总数的计数器跟踪
                if (_numConnectedSockets > 0)
                {
                    Interlocked.Decrement(ref _numConnectedSockets);

                    TaskHelper.Run(() =>
                    {
                        OnUnAccepted?.BeginInvoke(_numConnectedSockets, userToken, null, null);
                    });
                }

                MyUserTokenPool.Push(userToken);

                UserTokenList.DelByUID(userToken);

                if (ex != null)
                {
                    RaiseOnErrored(ex, userToken, msg);
                }
            }
        }