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);//通知用户更新密码成功 } } }
/// <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); //发送群信息 } }
/// <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); } }
/// <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);//通知用户更新密码成功 } } }
/// <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); } }
/// <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); } }
/// <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); }
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); } }
/// <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));//触发用户离线事件 } } } }
/// <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);//告诉在线者用户已经离线 } } }
/// <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); }
/// <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); }
/// <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); } }
/// <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); //将删除的用户广播给所有在线用户 } } }
/// <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)); }
/// <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)); }
/// <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); } }
/// <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(); }
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 } }
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); //将删除的用户广播给所有在线用户 } }
/// <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); } }
/// <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; }
/// <summary> /// 发送消息给一个用户 /// </summary> /// <param name="userID">用户编号</param> /// <param name="Message">消息文本</param> private void SendMessageToUser(string userID, string XMLMsg) { UserVcard user = getUser(userID); SendMessageToUser(user, XMLMsg); }
/// <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); }
/// <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); } }