/// <summary> /// 处理IQ逻辑 /// </summary> /// <param name="sInfo"></param> private static void ProcessIQ(StreamInfo sInfo) { IQ iq = (IQ)sInfo.Node; if (iq.Query != null) { //用户登录 if (iq.Query.GetType() == typeof(Auth)) { ProcessIQAuth(sInfo); } //视频请求 else if (iq.Query.GetType() == typeof(Rpc)) { } //语音请求 else if (iq.Query.GetType() == typeof(Oob)) { } //用户列表 else if (iq.Query.GetType() == typeof(Roster)) { ProcessIQRoster(sInfo); } } }
/// <summary> /// 添加队列 /// </summary> /// <param name="sInfo"></param> public static void Add(StreamInfo sInfo) { BackgroundWorker ProcessWorker = new BackgroundWorker(); ProcessWorker.DoWork += new DoWorkEventHandler(ProcessWorker_DoWork); ProcessWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ProcessWorker_RunWorkerCompleted); m_StreamQueue.Enqueue(sInfo); ProcessWorker.RunWorkerAsync(); }
private static void ProcessStreamInfo(StreamInfo sInfo) { if (sInfo == null) return; Console.WriteLine("Recv:{0}", sInfo.Node.ToString()); //开始一系列的逻辑处理 if(sInfo.Node.GetType() == typeof(IQ)) { ProcessIQ(sInfo); } else if (sInfo.Node.GetType() == typeof(Message)) { ProcessMessage(sInfo); } else if (sInfo.Node.GetType() == typeof(Presence)) { ProcessPresence(sInfo); } else if (sInfo.Node.GetType() == typeof(XMPPProtocol.Protocol.stream.Features)) { } else if (sInfo.Node.GetType() == typeof(Compressed)) { } }
/// <summary> /// 处理用户出席信息 /// </summary> /// <param name="sInfo"></param> private static void ProcessPresence(StreamInfo sInfo) { }
private static void ProcessMessage(StreamInfo sInfo) { }
/// <summary> /// 处理好友查询 /// </summary> /// <param name="sInfo"></param> private static void ProcessIQRoster(StreamInfo sInfo) { IQ iq = (IQ)sInfo.Node; if (iq.Type == IqType.get) { } }
/// <summary> /// 处理用户验证 /// </summary> /// <param name="sInfo"></param> private static void ProcessIQAuth(StreamInfo sInfo) { IQ iq = (IQ)sInfo.Node; Auth auth = (Auth)iq.Query; switch (iq.Type) { case IqType.get: iq.SwitchDirection(); iq.Type = IqType.result; auth.AddChild(new Element("password")); auth.AddChild(new Element("digest")); sInfo.Client.Send(iq); break; case IqType.set: User user = DataFactory.UserProvider.GetUserByUserName(auth.Username); //密码是MD5的大写 string digest = XMPPProtocol.Util.Hash.Sha1Hash(sInfo.Client.SessionID + user.UserPwd.ToUpper()); if (auth.Digest == digest && !string.IsNullOrEmpty(user.UserName)) //登录验证通过 { if (user.Status == 0) { iq.SwitchDirection(); iq.Type = IqType.error; iq.Query = null; iq.Error = new XMPPProtocol.Protocol.client.Error(); iq.Error.Message = "账户还没激活!"; sInfo.Client.Send(iq); } else if (user.Status == 2) { iq.SwitchDirection(); iq.Type = IqType.error; iq.Query = null; iq.Error = new XMPPProtocol.Protocol.client.Error(); iq.Error.Message = "账户被禁止登陆!"; sInfo.Client.Send(iq); } else { sInfo.Client.JID = new XMPPProtocol.Jid(auth.Username, IMServer.SERVERNAME, auth.Resource); //添加到全局客户端字典 ClientFactory.AddClient(sInfo.Client); //update 数据库 修改用户lastLoginIP lastLoginTime Server user.LastLoginIP = sInfo.Client.RemoteHostIP; user.Server = IMServer.SERVERNAME; DataFactory.UserProvider.UpdateUserLoginInfo(user); // sInfo.Client.User = user; //通知其他IMServer 逼在线的下线 //写入到登录日志 这里可以用log4net记录 //发送登录成功iq iq.SwitchDirection(); iq.Type = IqType.result; iq.Query = null; sInfo.Client.Send(iq); } } else { //验证失败,发送失败iq iq.SwitchDirection(); iq.Type = IqType.error; iq.Query = null; iq.Error = new XMPPProtocol.Protocol.client.Error(); iq.Error.Message = "用户名或密码错误!"; sInfo.Client.Send(iq); } break; } }