예제 #1
0
        void msgServer_RequestChangePassword(object sender, MsgServerEventArgs e)
        {
            ChangePassword changePWD = e.obj as ChangePassword;

            if (changePWD.NewPassword.Trim() == "")
            {
                return;
            }

            UserVcard user = getUser(changePWD.from);

            if (user == null)
            {
                return;
            }

            ///将密码Hash为MD5
            changePWD.OldPassword = IMLibrary3.Security.Hasher.GetMD5Hash(IMLibrary3.Operation.TextEncoder.textToBytes(changePWD.OldPassword.Trim()));
            changePWD.NewPassword = IMLibrary3.Security.Hasher.GetMD5Hash(IMLibrary3.Operation.TextEncoder.textToBytes(changePWD.NewPassword.Trim()));

            if (e.RequestUser.isAdmin || changePWD.OldPassword == user.Password)     //如果用户是管理员
            {
                if (DBHelper.UpdatePassword(user.UserID, changePWD.NewPassword) > 0) //更新密码
                {
                    user.Password = changePWD.NewPassword;
                    SendMessageToUser(e.RequestUser, e.XMLMsg);//通知用户更新密码成功
                }
            }
        }
예제 #2
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// 用户请求下载群信息
        /// </summary>
        /// <param name="orgRooms"></param>
        /// <param name="session"></param>
        private void onOrgRooms(Rooms orgRooms, TCPServerSession session)
        {
            UserVcard user = getUser(orgRooms.from);

            if (user == null)
            {
                return;              //如果未找到用户,退出
            }
            orgRooms.to = orgRooms.from; orgRooms.from = "";

            int i = 0;

            foreach (Room room in GetRooms(user))
            {
                orgRooms.Data.Add(room);
                i++;
                if (i == 5)                              //每次发送5个群信息
                {
                    SendMessageToUser(user, orgRooms);   //发送群信息
                    orgRooms.Data = new List <object>(); //用户信息清零
                    i             = 0;
                }
            }
            if (orgRooms.Data.Count > 0)           //发送剩下的群信息
            {
                SendMessageToUser(user, orgRooms); //发送群信息
            }
        }
예제 #3
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// 处理用户登录请求
        /// </summary>
        /// <param name="auth"></param>
        private void onLogin(Auth auth, TCPServerSession session)
        {
            UserVcard user = getUser(auth.UserID);

            if (user != null && !user.Disable && Hasher.GetMD5Hash(TextEncoder.textToBytes(auth.Password)) == user.Password) //如果用户存在未禁用且密码正确
            {
                #region 重复登录或异地登录
                if (user.Tag != null && user.Tag is TCPServerSession)
                {
                    ///通知用户此帐号异地登录
                    auth.type     = type.Else;
                    auth.Password = session.ID;
                    TCPServerSession se = user.Tag as TCPServerSession;
                    if (se != null && !se.IsDisposed && se.IsConnected)
                    {
                        tcpMessageServer.SendMessageToSession(se, auth);
                        se.Disconnect();//断开连接,释放资源
                    }
                }
                #endregion

                session.Tag             = user;
                session.IsAuthenticated = true;

                user.Tag      = session;
                user.ShowType = auth.ShowType;
                user.Status   = auth.Status;

                ///发送登录成功消息
                auth.UserName          = user.UserName;                 //告之登录用户的姓名
                auth.type              = type.result;                   //告之登录用户成功登录
                auth.Password          = session.ID;                    //告之登录用户在服务器的SESSION
                auth.LastDateTime      = user.LastDateTime;             //告之登录用户上次登录时间
                auth.LastIP            = user.LastIP;                   //告之登录用户上次登录IP
                auth.FileServerTCPPort = DBHelper.settings.TcpFilePort; //告之登录用户TCP文件传输服务端口
                auth.FileServerUDPPort = DBHelper.settings.UdpFilePort; //告之登录用户UDP文件传输服务端口
                auth.isAdmin           = user.isAdmin;                  //告之登录用户是否管理员
                auth.isBroadcast       = user.isBroadcast;              //告之登录用户是否可以发送广播消息
                auth.isSendNotice      = user.isSendNotice;             //告之登录用户是否可以发送通知消息
                auth.isSendSMS         = user.isSendSMS;                //告之登录用户是否可以发送手机短信
                auth.isEditUserData    = user.isEditUserData;           //告之登录用户是否可以编辑用户资料

                user.LastDateTime = DateTime.Now.ToString();
                user.LastIP       = session.RemoteEndPoint.Address.ToString();

                //通知用户登录成功
                tcpMessageServer.SendMessageToSession(session, auth);

                //发送企业组织机构版本信息给用户
                orgVersion.RoomsCount = user.Rooms.Count;//用户加入群的数量
                tcpMessageServer.SendMessageToSession(session, orgVersion);
            }
            else//如果用户不存在或密码错误
            {
                ///发送密码错误消息
                auth.type     = type.error;
                auth.Password = session.ID;
                tcpMessageServer.SendMessageToSession(session, auth);
            }
        }
예제 #4
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// 用户请求更新密码
        /// </summary>
        /// <param name="changePWD">变量密码协议</param>
        /// <param name="requestUser">请求用户</param>
        private void onChangePassword(ChangePassword changePWD, string XMLMsg, UserVcard requestUser)
        {
            if (changePWD.NewPassword.Trim() == "")
            {
                return;
            }

            UserVcard user = getUser(changePWD.from);

            if (user == null)
            {
                return;
            }

            ///将密码Hash为MD5
            changePWD.OldPassword = IMLibrary3.Security.Hasher.GetMD5Hash(IMLibrary3.Operation.TextEncoder.textToBytes(changePWD.OldPassword.Trim()));
            changePWD.NewPassword = IMLibrary3.Security.Hasher.GetMD5Hash(IMLibrary3.Operation.TextEncoder.textToBytes(changePWD.NewPassword.Trim()));

            if (requestUser.isAdmin || changePWD.OldPassword == user.Password)       //如果用户是管理员
            {
                if (DBHelper.UpdatePassword(user.UserID, changePWD.NewPassword) > 0) //更新密码
                {
                    user.Password = changePWD.NewPassword;
                    SendMessageToUser(requestUser, XMLMsg);//通知用户更新密码成功
                }
            }
        }
예제 #5
0
 /// <summary>
 /// 从群中获取用户集合数组
 /// </summary>
 /// <param name="room"></param>
 /// <returns></returns>
 private UserVcard[] GetUsers(Room room)
 {
     lock (room.Users)//确保线程安全
     {
         UserVcard[] Users = new UserVcard[room.Users.Count];
         room.Users.Values.CopyTo(Users, 0);
         return(Users);
     }
 }
예제 #6
0
 /// <summary>
 /// 从用户中获取加入的群集合数组
 /// </summary>
 /// <param name="user"></param>
 /// <returns></returns>
 private Room[] GetRooms(UserVcard user)
 {
     lock (user.Rooms)//确保线程安全
     {
         Room[] Rooms = new Room[user.Rooms.Count];
         user.Rooms.Values.CopyTo(Rooms, 0);
         return(Rooms);
     }
 }
예제 #7
0
        /// <summary>
        /// 从内存字典中获取用户
        /// </summary>
        /// <param name="userID"></param>
        /// <returns></returns>
        private UserVcard getUser(string userID)
        {
            UserVcard user = null;

            if (Users.ContainsKey(userID.Trim())) //如果用户存在
            {
                Users.TryGetValue(userID.Trim(), out user);
            }
            return(user);
        }
예제 #8
0
        void msgServer_RequestUsersPresence(object sender, MsgServerEventArgs e)
        {
            int     i       = 0;
            Element element = new Element();

            ///将在线用户的ShowType发送给登录用户
            foreach (TCPServerSession se in msgServer.GetTcpServerSession())
            {
                if (se.IsAuthenticated)                       //如果是已认证的TCP客户端
                {
                    UserVcard userTemp = se.Tag as UserVcard; //获得TCP客户端绑定的用户
                    Presence  pretemp  = new Presence();
                    pretemp.from     = userTemp.UserID;
                    pretemp.ShowType = userTemp.ShowType;
                    pretemp.Status   = pretemp.Status;

                    element.Data.Add(pretemp);
                }
                i++;

                if (i == 80)//一次发送80个用户
                {
                    SendMessageToUser(e.RequestUser, element);
                    i       = 0;
                    element = new Element();
                }
            }
            if (i > 0)//最一次发送在线用户状态
            {
                SendMessageToUser(e.RequestUser, element);
            }


            ///广播登录用户上线消息
            Presence pre = new Presence();

            pre.from     = e.RequestUser.UserID;
            pre.ShowType = e.RequestUser.ShowType;
            BroadcastingMessageToOnlineUser(pre);


            //发送离线消息
            List <string> offlineMsg = DBHelper.GetOfflineMessage(e.RequestUser.UserID, 50);//获取最后50条离线消息

            foreach (string msgXML in offlineMsg)
            {
                SendMessageToUser(e.RequestUser, msgXML);
            }
        }
예제 #9
0
        /// <summary>
        /// TCP连接断开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Session_Disonnected(object sender, EventArgs e)
        {
            TCPServerSession session = sender as TCPServerSession;

            if (session != null && session.IsAuthenticated)//如果该用户已经成功验证登录
            {
                UserVcard user = session.Tag as UserVcard;
                if (user != null)
                {
                    if (UserOffline != null)
                    {
                        UserOffline(this, new MsgServerEventArgs(session, "", null, user));//触发用户离线事件
                    }
                }
            }
        }
예제 #10
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// TCP连接断开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Session_Disonnected(object sender, EventArgs e)
        {
            TCPServerSession session = sender as TCPServerSession;

            if (session != null && session.IsAuthenticated)//如果该用户已经成功验证登录
            {
                UserVcard user = session.Tag as UserVcard;
                if (user != null)
                {
                    Presence presence = new Presence();
                    presence.from     = user.UserID;
                    presence.ShowType = IMLibrary3.Enmu.ShowType.Offline;
                    BroadcastingMessageToOnlineUser(presence);//告诉在线者用户已经离线
                }
            }
        }
예제 #11
0
        /// <summary>
        /// 获取用户资料
        /// </summary>
        /// <param name="UserID"></param>
        /// <returns></returns>
        public static UserVcard GetUserVcard(string UserID)
        {
            UserVcard card = null;
            string    sql  = "select  Vcard from UsersVcard  where UserID=@UserID";

            System.Data.SQLite.SQLiteParameter[] parameters = new System.Data.SQLite.SQLiteParameter[] {
                new System.Data.SQLite.SQLiteParameter("@UserID", UserID)
            };
            System.Data.SQLite.SQLiteDataReader dr = SQLiteDBHelper.ExecuteReader(sql, parameters);
            if (dr != null && dr.Read())
            {
                card = Factory.CreateInstanceObject(Convert.ToString(dr["Vcard"])) as UserVcard;
                dr.Close();
            }
            dr.Dispose();
            return(card);
        }
예제 #12
0
        /// <summary>
        /// 将所有数据库中用户详细信息读入内存
        /// </summary>
        /// <returns></returns>
        public static Dictionary <string, UserVcard> GetUserVcards()
        {
            Dictionary <string, UserVcard> users = new Dictionary <string, UserVcard>();

            System.Data.SqlClient.SqlDataReader dr = DataAccess.GetReaderBySql("select * from users");
            if (dr != null)
            {
                while (dr.Read())
                {
                    UserVcard user = new UserVcard();

                    user.UserID         = dr["UserID"].ToString().Trim();
                    user.UserName       = dr["UserName"] is DBNull ? user.UserID : dr["UserName"].ToString().Trim();
                    user.Password       = dr["Password"] is DBNull ? "E10ADC3949BA59ABBE56E057F20F883E" : dr["Password"].ToString().Trim();//123456
                    user.Sex            = Convert.ToByte(dr["Sex"] is DBNull ? 0 : dr["Sex"]);
                    user.FaceIndex      = Convert.ToInt32(dr["FaceIndex"] is DBNull ? 0 : dr["FaceIndex"]);
                    user.GroupID        = dr["GroupID"] is DBNull ? "" : dr["GroupID"].ToString().Trim();
                    user.OrderID        = Convert.ToInt32(dr["OrderID"] is DBNull ? 0 : dr["OrderID"]);
                    user.isAdmin        = Convert.ToBoolean(dr["isAdmin"] is DBNull ? false : dr["isAdmin"]);
                    user.isBroadcast    = Convert.ToBoolean(dr["isBroadcast"] is DBNull ? false : dr["isBroadcast"]);
                    user.isEditUserData = Convert.ToBoolean(dr["isEditUserData"] is DBNull ? false : dr["isEditUserData"]);
                    user.isSendNotice   = Convert.ToBoolean(dr["isSendNotice"] is DBNull ? false : dr["isSendNotice"]);
                    user.isSendSMS      = Convert.ToBoolean(dr["isSendSMS"] is DBNull ? false : dr["isSendSMS"]);
                    user.CreateRooms    = Convert.ToInt32(dr["CreateRooms"] is DBNull ? 0 : dr["CreateRooms"]);
                    user.LastIP         = dr["LastIP"] is DBNull ? "" : dr["LastIP"].ToString().Trim();
                    user.LastDateTime   = dr["LastDateTime"] is DBNull ? "" : dr["LastDateTime"].ToString().Trim();
                    string    cardstring = dr["Vcard"] is DBNull ? "<x x=\"\"/>" : dr["Vcard"].ToString().Trim();
                    UserVcard card       = Factory.CreateInstanceObject(cardstring) as UserVcard; //鸡生蛋还是蛋生鸡?肯定有一个在前:)
                    if (card != null)                                                             //扩展资料,可以添加很多
                    {
                        user.Mail        = card.Mail;
                        user.OfficePhone = card.OfficePhone;
                        user.Phone       = card.Phone;
                        user.Post        = card.Post;
                        user.Remark      = card.Remark;
                        user.Job         = card.Job;
                        user.Birthday    = card.Birthday;
                    }
                    users.Add(user.UserID, user);
                }
                dr.Close();
            }
            dr.Dispose();
            return(users);
        }
예제 #13
0
        /// <summary>
        /// 更新用户Card,无数据则添加
        /// </summary>
        /// <param name="card"></param>
        public static void UpdateUserVcard(UserVcard card)
        {
            string sql = "update Users set UserName=@UserName,GroupID=@GroupID,OrderID=@OrderID where UserID=@UserID;"
                         + "update UsersVcard set Vcard=@Vcard,LastUpdateTime=@LastUpdateTime where UserID=@UserID";

            System.Data.SQLite.SQLiteParameter[] parameters = new System.Data.SQLite.SQLiteParameter[] {
                new System.Data.SQLite.SQLiteParameter("@UserID", card.UserID),
                new System.Data.SQLite.SQLiteParameter("@UserName", card.UserName),
                new System.Data.SQLite.SQLiteParameter("@GroupID", card.GroupID),
                new System.Data.SQLite.SQLiteParameter("@OrderID", card.OrderID),
                new System.Data.SQLite.SQLiteParameter("@Vcard", IMLibrary3.Protocol.Factory.CreateXMLMsg(card)),
                new System.Data.SQLite.SQLiteParameter("@LastUpdateTime", DateTime.Now),
            };
            if (SQLiteDBHelper.ExecuteNonQuery(sql, parameters) == 0)
            {
                sql = "insert into Users(UserID,UserName,GroupID,OrderID) values(@UserID,@UserName,@GroupID,@OrderID);" +
                      "insert into UsersVcard(UserID,Vcard,LastUpdateTime) values(@UserID,@Vcard,@LastUpdateTime)";
                SQLiteDBHelper.ExecuteNonQuery(sql, parameters);
            }
        }
예제 #14
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// 管理员变更分组信息
        /// </summary>
        /// <param name="card"></param>
        /// <param name="xmlMsg"></param>
        /// <param name="session"></param>
        private void onGroupVcard(GroupVcard card, string xmlMsg, TCPServerSession session)
        {
            if (card.GroupID.Trim() == "" || card.GroupName.Trim() == "")
            {
                return;
            }
            card.GroupID = card.GroupID.Trim();

            UserVcard requestUser = session.Tag as UserVcard; //请求用户

            if (card.type == type.New && requestUser.isAdmin) //如果用户是管理员
            {
                if (DBHelper.CreateGroupVcard(card) > 0)      //保存于数据库
                {
                    orgVersion = DBHelper.ResetOrgVersion();  //重设组织架构版本相关信息
                    BroadcastingMessageToOnlineUser(xmlMsg);  //将创建的分组信息广播给所有在线用户
                }
            }
            else if (card.type == type.set && requestUser.isAdmin) //如果是更新分组信息
            {
                if (DBHelper.UpdateGroupVcard(card) > 0)           //更新数据库
                {
                    orgVersion = DBHelper.ResetOrgVersion();       //重设组织架构版本相关信息
                    SendMessageToUser(requestUser, xmlMsg);        //通知管理员创建新用户成功
                }
            }
            else if (card.type == type.get)//如果是更新
            {
                card.type = type.result;
                SendMessageToUser(requestUser, Factory.CreateXMLMsg(card)); //将分组信息资料发送给请求者
            }
            else if (card.type == type.delete && requestUser.isAdmin)       //如果是删除分组
            {
                if (DBHelper.DelGroup(card.GroupID) > 0)                    //数据库中删除
                {
                    orgVersion = DBHelper.ResetOrgVersion();                //重设组织架构版本相关信息
                    BroadcastingMessageToOnlineUser(xmlMsg);                //将删除的用户广播给所有在线用户
                }
            }
        }
예제 #15
0
        /// <summary>
        /// 创建新用户
        /// </summary>
        /// <param name="card"></param>
        public static int  CreateUserVcard(UserVcard card)
        {
            string sql = "insert into Users(userID,userName,GroupID,orderID,sex,Password,FaceIndex,CreateRooms,isAdmin,isSendSMS,isEditUserData,isSendNotice,isBroadcast,Vcard)"
                         + "values(@userID,@userName,@GroupID,@orderID,@sex,@Password,@FaceIndex,@CreateRooms,@isAdmin,@isSendSMS,@isEditUserData,@isSendNotice,@isBroadcast,@Vcard)";

            System.Data.SqlClient.SqlParameter[] sqlpar = new System.Data.SqlClient.SqlParameter[]
            { new System.Data.SqlClient.SqlParameter("@userID", card.UserID),
              new System.Data.SqlClient.SqlParameter("@userName", card.UserName),
              new System.Data.SqlClient.SqlParameter("@GroupID", card.GroupID),
              new System.Data.SqlClient.SqlParameter("@orderID", card.OrderID),
              new System.Data.SqlClient.SqlParameter("@sex", card.Sex),
              new System.Data.SqlClient.SqlParameter("@Password", card.Password),
              new System.Data.SqlClient.SqlParameter("@FaceIndex", card.FaceIndex),
              new System.Data.SqlClient.SqlParameter("@CreateRooms", card.CreateRooms),
              new System.Data.SqlClient.SqlParameter("@isAdmin", card.isAdmin),
              new System.Data.SqlClient.SqlParameter("@isSendSMS", card.isSendSMS),
              new System.Data.SqlClient.SqlParameter("@isEditUserData", card.isEditUserData),
              new System.Data.SqlClient.SqlParameter("@isSendNotice", card.isSendNotice),
              new System.Data.SqlClient.SqlParameter("@isBroadcast", card.isBroadcast),
              new System.Data.SqlClient.SqlParameter("@Vcard", Factory.CreateXMLMsg(card)), };
            return(IMLibrary.SqlData.DataAccess.ExecSql(sql, sqlpar));
        }
예제 #16
0
        /// <summary>
        /// 更新用户信息
        /// </summary>
        /// <param name="card"></param>
        public static int  UpdateUserVcard(UserVcard card)
        {
            string sql = "update Users set userName=@userName,GroupID=@GroupID,orderID=@orderID,sex=@sex,Password=@Password,FaceIndex=@FaceIndex,"
                         + "CreateRooms=@CreateRooms,isAdmin=@isAdmin,isSendSMS=@isSendSMS,isEditUserData=@isEditUserData,isSendNotice=@isSendNotice,isBroadcast=@isBroadcast,Vcard=@Vcard"
                         + " where userID=@userID";

            System.Data.SqlClient.SqlParameter[] sqlpar = new System.Data.SqlClient.SqlParameter[]
            { new System.Data.SqlClient.SqlParameter("@userID", card.UserID),
              new System.Data.SqlClient.SqlParameter("@userName", card.UserName),
              new System.Data.SqlClient.SqlParameter("@GroupID", card.GroupID),
              new System.Data.SqlClient.SqlParameter("@orderID", card.OrderID),
              new System.Data.SqlClient.SqlParameter("@sex", card.Sex),
              new System.Data.SqlClient.SqlParameter("@Password", card.Password),
              new System.Data.SqlClient.SqlParameter("@FaceIndex", card.FaceIndex),
              new System.Data.SqlClient.SqlParameter("@CreateRooms", card.CreateRooms),
              new System.Data.SqlClient.SqlParameter("@isAdmin", card.isAdmin),
              new System.Data.SqlClient.SqlParameter("@isSendSMS", card.isSendSMS),
              new System.Data.SqlClient.SqlParameter("@isEditUserData", card.isEditUserData),
              new System.Data.SqlClient.SqlParameter("@isSendNotice", card.isSendNotice),
              new System.Data.SqlClient.SqlParameter("@isBroadcast", card.isBroadcast),
              new System.Data.SqlClient.SqlParameter("@Vcard", Factory.CreateXMLMsg(card)), };
            return(IMLibrary.SqlData.DataAccess.ExecSql(sql, sqlpar));
        }
예제 #17
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// 处理用户请求获得所有在线联系人的在线状态
        /// </summary>
        /// <param name="pre"></param>
        /// <param name="session"></param>
        private void onGetUsersPresence(Presence pre, TCPServerSession session)
        {
            ///将在线用户的Presence发送给登录用户
            Element e = new Element();

            foreach (TCPServerSession se in tcpMessageServer.Sessions.ToArray())
            {
                if (se.IsAuthenticated)                       //如果是已认证的TCP客户端
                {
                    UserVcard userTemp = se.Tag as UserVcard; //获得TCP客户端绑定的用户
                    Presence  pretemp  = new Presence();
                    pretemp.from     = userTemp.UserID;
                    pretemp.ShowType = userTemp.ShowType;
                    pretemp.Status   = pretemp.Status;

                    e.Data.Add(pretemp);
                }
            }
            tcpMessageServer.SendMessageToSession(session, e);

            ///广播登录用户上线消息
            UserVcard user = session.Tag as UserVcard;

            pre          = new Presence();
            pre.from     = user.UserID;
            pre.ShowType = user.ShowType;
            BroadcastingMessageToOnlineUser(pre);

            //发送离线消息
            List <string> offlineMsg = DBHelper.GetOfflineMessage(user.UserID, 50);//获取最后50条离线消息

            foreach (string msgXML in offlineMsg)
            {
                SendMessageToUser(user, msgXML);
            }
        }
예제 #18
0
        /// <summary>
        /// 开始服务
        /// </summary>
        /// <param name="P2PFileServerPort">P2P服务传输服务端口(UDP)</param>
        /// <param name="ImageFileServerPort">图片文件传输服务端口(TCP)</param>
        /// <param name="MessageServerPort">消息服务端口(TCP)</param>
        /// <param name="P2PAVServerPort">音视频服务端口(UDP)</param>
        public void Start(int P2PFileServerPort, int P2PAVServerPort, int ImageFileServerPort, int MessageServerPort)
        {
            #region 初始化组织架构

            ///初始化数据库连接字符串
            IMLibrary.SqlData.DataAccess.ConnectionString = DBHelper.settings.SqlConStr;


            /// 初始化用户
            if (Users == null)
            {
                Users = DBHelper.GetUserVcards();
            }


            /// 获取组织机构版本和信息
            {
                orgVersion = DBHelper.ResetOrgVersion(); //重设组织架构版本相关信息
            }

            #region  初始化群
            if (Rooms == null)
            {
                Rooms = DBHelper.GetRooms();
                foreach (Room room in Rooms.Values)
                {
                    #region 将内存中的用户添加到内存中的群
                    string[] userids = room.UserIDs.Split(';');
                    foreach (string userID in userids)
                    {
                        UserVcard user = getUser(userID);
                        if (user != null)
                        {
                            if (room.Users == null)
                            {
                                room.Users = new Dictionary <string, User>();
                            }
                            if (!room.Users.ContainsKey(userID))
                            {
                                if (room.CreateUserID == userID)
                                {
                                    user.CreatedRoomsCount++;                             //标记用户已创建群数
                                }
                                room.Users.Add(user.UserID, user);
                            }

                            if (user.Rooms == null)
                            {
                                user.Rooms = new Dictionary <string, Room>();
                            }
                            if (!user.Rooms.ContainsKey(room.RoomID))
                            {
                                user.Rooms.Add(room.RoomID, room);
                            }
                        }
                    }

                    room.UserIDs = "";//重新生成群包含的Users
                    foreach (User u in GetUsers(room))
                    {
                        room.UserIDs += u.UserID + ";";
                    }

                    #endregion
                }
            }
            #endregion

            #endregion

            //启动消息服务
            if (msgServer == null)
            {
                msgServer                          = new MsgServer(MessageServerPort);
                msgServer.Login                   += new MsgServer.MsgServerEventHandler(msgServer_Login);
                msgServer.UserOffline             += new MsgServer.MsgServerEventHandler(msgServer_UserOffline);
                msgServer.Message                 += new MsgServer.MsgServerEventHandler(msgServer_Message);
                msgServer.Presence                += new MsgServer.MsgServerEventHandler(msgServer_Presence);
                msgServer.RequestChangeGroupVcard += new MsgServer.MsgServerEventHandler(msgServer_RequestChangeGroupVcard);
                msgServer.RequestChangePassword   += new MsgServer.MsgServerEventHandler(msgServer_RequestChangePassword);
                msgServer.RequestChangeRoom       += new MsgServer.MsgServerEventHandler(msgServer_RequestChangeRoom);
                msgServer.RequestChangeUserVcard  += new MsgServer.MsgServerEventHandler(msgServer_RequestChangeUserVcard);
                msgServer.RequestOrgGroups        += new MsgServer.MsgServerEventHandler(msgServer_RequestOrgGroups);
                msgServer.RequestOrgRooms         += new MsgServer.MsgServerEventHandler(msgServer_RequestOrgRooms);
                msgServer.RequestOrgUsers         += new MsgServer.MsgServerEventHandler(msgServer_RequestOrgUsers);
                msgServer.RequestUsersPresence    += new MsgServer.MsgServerEventHandler(msgServer_RequestUsersPresence);
                msgServer.RouteDownLoadImageFile  += new MsgServer.MsgServerEventHandler(msgServer_RouteDownLoadImageFile);
                msgServer.RouteP2PFileTransmit    += new MsgServer.MsgServerEventHandler(msgServer_RouteP2PFileTransmit);
                msgServer.RouteAVMsg              += new MsgServer.MsgServerEventHandler(msgServer_RouteAVMsg);
            }
            msgServer.Start();

            //启动P2P文件服务
            if (p2pFileServer == null)
            {
                p2pFileServer = new P2PFileServer(P2PFileServerPort);
            }
            p2pFileServer.Start();

            //启动图片文件服务
            if (imageFileServer == null)
            {
                imageFileServer = new ImageFileServer(ImageFileServerPort);
            }
            imageFileServer.Start();

            //启动音视频传输服务
            if (p2pAVServer == null)
            {
                p2pAVServer = new P2PAVServer(P2PAVServerPort);
            }
            p2pAVServer.Start();
        }
예제 #19
0
        void msgServer_RequestChangeRoom(object sender, MsgServerEventArgs e)
        {
            ChangeRoom changeRoom = e.obj as ChangeRoom;

            if (changeRoom.type == type.New && e.RequestUser.CreatedRoomsCount < e.RequestUser.CreateRooms)//如果请求创建群
            {
                #region 创建群

                //10次随机产生群号(所谓摇号),如果10次摇出的群号都已被创建,则退出并表示服务器忙
                //10都不能摇到空号表示用户运气不好,下次再试!
                for (int i = 0; i < 10; i++)
                {
                    Random ran     = new Random();
                    int    RandKey = ran.Next(10000, 1000000000); //开始摇号,群号码从10000至1000000000随机产生
                    if (!Rooms.ContainsKey(RandKey.ToString()))   //如果是空号,以此号创建群
                    {
                        Room room = new Room();
                        room.RoomID       = RandKey.ToString();
                        room.RoomName     = changeRoom.RoomName;
                        room.Notice       = changeRoom.Notice;
                        room.UserIDs      = changeRoom.UserIDs;
                        room.CreateUserID = e.RequestUser.UserID; //创建者为请求者

                        e.RequestUser.CreatedRoomsCount++;        //标记用户创建群数

                        #region 将内存中的用户添加到内存中的群
                        string[] userids = room.UserIDs.Split(';');
                        foreach (string userID in userids)
                        {
                            UserVcard user = getUser(userID);
                            if (user != null)
                            {
                                if (room.Users == null)
                                {
                                    room.Users = new Dictionary <string, User>();
                                }
                                if (!room.Users.ContainsKey(userID))
                                {
                                    room.Users.Add(user.UserID, user);
                                }

                                if (user.Rooms == null)
                                {
                                    user.Rooms = new Dictionary <string, Room>();
                                }
                                if (!user.Rooms.ContainsKey(room.RoomID))
                                {
                                    user.Rooms.Add(room.RoomID, room);
                                }
                            }
                        }

                        room.UserIDs = "";//重新生成群包含的Users
                        foreach (User u in GetUsers(room))
                        {
                            room.UserIDs += u.UserID + ";";
                        }
                        #endregion

                        Rooms.Add(room.RoomID, room); //将创建的群添加到内存

                        DBHelper.CreateRoom(room);    //将创建的群添加到数据库

                        changeRoom.RoomID       = room.RoomID;
                        changeRoom.CreateUserID = room.CreateUserID;

                        SendMessageToRoom(room.CreateUserID, room, Factory.CreateXMLMsg(changeRoom)); //发送消息到刚创建的群,通知群里的用户已经加入群

                        return;                                                                       //创建群成功,退出
                    }
                }
                #endregion
            }
            else if (changeRoom.type == type.set)//请求更新群
            {
                #region 更新群
                Room room = getRoom(changeRoom.RoomID);
                if (room != null && room.CreateUserID == e.RequestUser.UserID)//如果群创建者为请求用户
                {
                    string oldVersion = room.RoomName.Trim() + room.Notice.Trim() + room.UserIDs;
                    changeRoom.CreateUserID = room.CreateUserID;
                    room.Notice             = changeRoom.Notice;
                    room.RoomName           = changeRoom.RoomName;
                    string[] newUserids = changeRoom.UserIDs.Split(';');

                    #region 查找群中被删除的用户

                    changeRoom.type    = type.delete; //标识删除群
                    changeRoom.UserIDs = null;        //不要将新群包含的用户通知退出群的用户

                    string delRoomMsg = IMLibrary3.Protocol.Factory.CreateXMLMsg(changeRoom);
                    bool   t          = false;
                    foreach (UserVcard user in GetUsers(room))
                    {
                        t = false;
                        foreach (string userID in newUserids)
                        {
                            if (user.UserID == userID)//如果群里的用户在更新后的用户集合中存在,则表示未删除
                            {
                                t = true;
                            }
                        }

                        if (!t)//如果更新的用户集合中没有当前用户,则表示从群中删除此用户
                        {
                            room.Users.Remove(user.UserID);
                            user.Rooms.Remove(room.RoomID);
                            SendMessageToUser(user, delRoomMsg);//通知用户退出群
                        }
                    }
                    #endregion

                    #region 添加新用户记录群中新用户
                    foreach (string userID in newUserids)
                    {
                        UserVcard user = getUser(userID);//获取新用户
                        if (user != null)
                        {
                            if (!room.Users.ContainsKey(user.UserID))
                            {
                                room.Users.Add(user.UserID, user);//如果群里无此用户,则新增用户
                                if (!user.Rooms.ContainsKey(room.RoomID))
                                {
                                    user.Rooms.Add(room.RoomID, room);//如果用户不在此群,则为用户新增群
                                }
                            }
                        }
                    }
                    #endregion

                    room.UserIDs = "";//重新生成群包含的Users
                    foreach (User u in GetUsers(room))
                    {
                        room.UserIDs += u.UserID + ";";
                    }

                    changeRoom.type    = type.set;     //标识群信息被成功修改
                    changeRoom.UserIDs = room.UserIDs; //设置最新用户列表

                    string newVersion = room.RoomName.Trim() + room.Notice.Trim() + room.UserIDs;

                    if (oldVersion == newVersion)
                    {
                        return;                                                                   //如果没有做任何更改
                    }
                    SendMessageToRoom(room.CreateUserID, room, Factory.CreateXMLMsg(changeRoom)); //通知群内原用户,群信息已经修改

                    DBHelper.UpdateRoom(room);
                }
                #endregion
            }
        }
예제 #20
0
        void msgServer_RequestChangeUserVcard(object sender, MsgServerEventArgs e)
        {
            UserVcard card = e.obj as UserVcard;

            if (card.UserID.Trim() == "" || card.UserName.Trim() == "" || card.GroupID.Trim() == "")
            {
                return;
            }
            card.UserID = card.UserID.Trim();

            UserVcard user = getUser(card.UserID);

            if (card.type == type.New && user == null && e.RequestUser.isAdmin)//如果用户不存在,创建新用户
            {
                Users.Add(card.UserID, card);
                //设置新用户密码为123456;
                card.Password = IMLibrary3.Security.Hasher.GetMD5Hash(IMLibrary3.Operation.TextEncoder.textToBytes("123456"));

                DBHelper.CreateUserVcard(card);                      //保存于数据库
                orgVersion = DBHelper.ResetOrgVersion();             //重设组织架构版本相关信息

                BroadcastingMessageToOnlineUser(e.XMLMsg);           //将创建的新用户信息广播给所有在线用户
            }
            else if (card.type == type.set && e.RequestUser.isAdmin) //如果是更新用户
            {
                if (user == null)
                {
                    return;                                                                 //如果用户不存在则退出
                }
                string oldInfo = user.UserName + user.GroupID + user.OrderID;               //老信息
                string newInfo = card.UserName.Trim() + card.GroupID.Trim() + card.OrderID; //新信息

                user.UserName     = card.UserName.Trim();
                user.GroupID      = card.GroupID.Trim();
                user.OrderID      = card.OrderID;
                user.Job          = card.Job.Trim();
                user.OfficePhone  = card.OfficePhone.Trim();
                user.Mail         = card.Mail.Trim();
                user.Phone        = card.Phone.Trim();
                user.Post         = card.Post.Trim();
                user.Remark       = card.Remark.Trim();
                user.Birthday     = card.Birthday.Trim();
                user.Sex          = card.Sex;
                user.CreateRooms  = card.CreateRooms;
                user.Disable      = card.Disable;
                user.isAdmin      = card.isAdmin;
                user.isSendNotice = card.isSendNotice;
                user.isSendSMS    = card.isSendSMS;

                DBHelper.UpdateUserVcard(user);              //更新数据库
                if (oldInfo != newInfo)                      //如果用户基本信息发生变更,则变更组织架构
                {
                    orgVersion = DBHelper.ResetOrgVersion(); //重设组织架构版本相关信息
                }
                SendMessageToUser(e.RequestUser, e.XMLMsg);  //通知管理员创建新用户成功
            }
            else if (card.type == type.get)                  //如果是获取用户资料
            {
                if (user == null)
                {
                    return;              //如果用户不存在则退出
                }
                user.type = type.result;
                SendMessageToUser(e.RequestUser, Factory.CreateXMLMsg(user)); //将用户资料发送给请求者
            }
            else if (card.type == type.delete && e.RequestUser.isAdmin)       //如果是删除用户
            {
                if (user == null)
                {
                    return;              //如果用户不存在则退出
                }
                if (e.RequestUser.UserID == user.UserID)
                {
                    return;                                     //如果管理员想删除自己,退出
                }
                TCPServerSession se = user.Tag as TCPServerSession;
                if (se != null && se.IsConnected)
                {
                    se.Disconnect(); se.Dispose();
                }                                                                   //如果删除的用户在线,则将其踢出
                Users.Remove(card.UserID);

                DBHelper.DelUser(card.UserID);             //数据库中删除
                orgVersion = DBHelper.ResetOrgVersion();   //重设组织架构版本相关信息

                BroadcastingMessageToOnlineUser(e.XMLMsg); //将删除的用户广播给所有在线用户
            }
        }
예제 #21
0
        /// <summary>
        /// TCP连接数据包到达事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void messageSession_PacketReceived(object sender, TcpSessionEventArgs e)
        {
            Console.WriteLine(e.Data);
            if (e.Data.Length < 2)
            {
                return;
            }

            TCPServerSession Session = sender as TCPServerSession;

            object obj = Factory.CreateInstanceObject(e.Data);

            if (obj != null)     //如果收到的消息对像不为空
            {
                if (obj is Auth) //登录请求
                {
                    if (Login != null)
                    {
                        Login(this, new MsgServerEventArgs(Session, e.Data, obj, null));
                    }
                }
                else if (Session.IsAuthenticated)                     //如果提供其他服务客户端必须是已经进行验证后
                {
                    UserVcard RequestUser = Session.Tag as UserVcard; //获得请求用户
                    if (RequestUser == null)
                    {
                        return;         //如果用户为空,退出
                    }
                    if (obj is Message) //请求转发消息
                    {
                        if (Message != null)
                        {
                            Message(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is Presence)                   //请求在线状态
                    {
                        if ((obj as Presence).type == type.set) //设置在线状态
                        {
                            if (Presence != null)
                            {
                                Presence(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                            }
                        }
                        else if ((obj as Presence).type == type.get)//获得联系人在线状态
                        {
                            if (RequestUsersPresence != null)
                            {
                                RequestUsersPresence(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                            }
                        }
                    }
                    else if (obj is DownloadGroups)//请求下载的分组信息
                    {
                        if (RequestOrgGroups != null)
                        {
                            RequestOrgGroups(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is DownloadUsers)//请求下载用户信息
                    {
                        if (RequestOrgUsers != null)
                        {
                            RequestOrgUsers(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is DownloadRooms)//请求下载群信息
                    {
                        if (RequestOrgRooms != null)
                        {
                            RequestOrgRooms(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is ChangeRoom)//更新群信息
                    {
                        if (RequestChangeRoom != null)
                        {
                            RequestChangeRoom(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is ImageFileMsg) //通知客户端到文件服务器下载已上传完成的文件
                    {
                        if (RouteDownLoadImageFile != null)
                        {
                            RouteDownLoadImageFile(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is P2PFileMsg) //转发文件传输消息
                    {
                        if (RouteP2PFileTransmit != null)
                        {
                            RouteP2PFileTransmit(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is AVMsg)//转发音视频对话的消息
                    {
                        if (RouteAVMsg != null)
                        {
                            RouteAVMsg(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }


                    #region 组织架构信息管理
                    if (obj is UserVcard)//如果是管理员变更用户信息资料
                    {
                        if (RequestChangeUserVcard != null)
                        {
                            RequestChangeUserVcard(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is GroupVcard)//如果是管理员变更分组信息资料
                    {
                        if (RequestChangeGroupVcard != null)
                        {
                            RequestChangeGroupVcard(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    else if (obj is ChangePassword)//如果是要求修改密码
                    {
                        if (RequestChangePassword != null)
                        {
                            RequestChangePassword(this, new MsgServerEventArgs(Session, e.Data, obj, RequestUser));
                        }
                    }
                    #endregion
                }
            }
            else //收到非法消息
            {
                OnBadCommand(Session);
            }
        }
예제 #22
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="Session">TCP客户端</param>
 /// <param name="XMLMsg">XML消息字符串</param>
 /// <param name="obj">消息转换的对像</param>
 /// <param name="RequestUser">请求用户</param>
 public MsgServerEventArgs(TCPServerSession Session, string XMLMsg, object obj, UserVcard RequestUser)
 {
     this.Session     = Session;
     this.XMLMsg      = XMLMsg;
     this.obj         = obj;
     this.RequestUser = RequestUser;
 }
예제 #23
0
        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="userID">用户编号</param>
        /// <param name="Message">消息文本</param>
        private void SendMessageToUser(string userID, string XMLMsg)
        {
            UserVcard user = getUser(userID);

            SendMessageToUser(user, XMLMsg);
        }
예제 #24
0
        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="userID">用户编号</param>
        /// <param name="e">Element</param>
        private void SendMessageToUser(string userID, Element e)
        {
            UserVcard user = getUser(userID);

            SendMessageToUser(user, e);
        }
예제 #25
0
파일: Class1.cs 프로젝트: ACE-liu/finalJob
        /// <summary>
        /// TCP连接数据包到达事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void messageSession_PacketReceived(object sender, TcpSessionEventArgs e)
        {
            Console.WriteLine(e.Data);
            if (e.Data.Length < 2)
            {
                return;
            }

            TCPServerSession Session = sender as TCPServerSession;

            object obj = Factory.CreateInstanceObject(e.Data);

            if (obj != null)     //如果收到的消息对像不为空
            {
                if (obj is Auth) //登录请求
                {
                    onLogin(obj as Auth, Session);
                }
                else if (Session.IsAuthenticated)                     //如果提供其他服务客户端必须是已经进行验证后
                {
                    UserVcard requestUser = Session.Tag as UserVcard; //获得请求用户


                    if (obj is Message)//请求转发消息
                    {
                        onMessage(obj as Message, Session);
                    }
                    else if (obj is Presence)                   //请求在线状态
                    {
                        if ((obj as Presence).type == type.set) //设置在线状态
                        {
                            onPresence(obj as Presence, Session);
                        }
                        else if ((obj as Presence).type == type.get)//获得联系人在线状态
                        {
                            onGetUsersPresence(obj as Presence, Session);
                        }
                    }
                    else if (obj is Groups)//请求下载的分组信息
                    {
                        onOrgGroups(obj as Groups, Session);
                    }
                    else if (obj is Users)//请求下载用户信息
                    {
                        onOrgUsers(obj as Users, Session);
                    }
                    else if (obj is Rooms)//请求下载群信息
                    {
                        onOrgRooms(obj as Rooms, Session);
                    }
                    else if (obj is ChangeRoom)//更新群信息
                    {
                        onChangeRoom(obj as ChangeRoom, Session);
                    }
                    else if (obj is TCPImageFile)//通知客户端到文件服务器下载已上传完成的文件
                    {
                        onTCPImageFile(obj as TCPImageFile, e.Data, Session);
                    }
                    else if (obj is PFile)//转发文件传输消息
                    {
                        onPFile(obj as PFile, e.Data, Session);
                    }


                    #region 组织架构信息管理
                    if (obj is UserVcard)//如果是管理员变更用户信息资料
                    {
                        onUserVcard(obj as UserVcard, e.Data, Session);
                    }
                    else if (obj is GroupVcard)
                    {
                        onGroupVcard(obj as GroupVcard, e.Data, Session);
                    }
                    else if (obj is ChangePassword)
                    {
                        onChangePassword(obj as ChangePassword, e.Data, requestUser);
                    }
                    #endregion
                }
            }
            else //收到非法消息
            {
                OnBadCommand(Session);
            }
        }