/// <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(); }
/// <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); } } }