Пример #1
0
 /// <summary>
 /// 发送消息到文件客户端
 /// </summary>
 /// <param name="e"></param>
 private void sendFileMsg(Element e, TCPServerSession se)
 {
     if (se != null && se.IsConnected)
     {
         tcpFileServer.SendMessageToSession(se, Factory.CreateXMLMsg(e));
     }
 }
Пример #2
0
    public void Run()
    {
        while (this.open)
        {
            Console.WriteLine("listening for incomming connections...");

            // wait for incoming client connection requests
            Socket s = this.listener.AcceptSocket();
            if (s.Connected)
            {
                Console.WriteLine("client connected, starting client session...");

                // create a client session
                TCPServerSession session = new TCPServerSession(s, this.executeCommand);
                // add it to the session list
                this.sessions.Add(session);

                // create a thread for the session
                Thread th = new Thread(new ThreadStart(session.Run));
                // start it
                th.Start();
                // add it to the session thread list
                this.sessionThreads.Add(th);
            }
        }
    }
Пример #3
0
        /// <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
 /// <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;
 }
Пример #5
0
        /// <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); //发送群信息
            }
        }
Пример #6
0
        /// <summary>
        /// 处理用户请求转发聊天消息
        /// </summary>
        /// <param name="presence"></param>
        /// <param name="session"></param>
        private void onMessage(Message msg, TCPServerSession session)
        {
            msg.DateTime = DateTime.Now.ToString();                  //将消息发送时间设置为服务器的时间

            if (msg.MessageType == IMLibrary3.Enmu.MessageType.User) //如果消息发送给用户
            {
                SendMessageToUser(msg.to, msg);
            }
            else if (msg.MessageType == IMLibrary3.Enmu.MessageType.Group)
            {
                SendMessageToRoom(msg.from, msg.to, msg);
            }
            else if (msg.MessageType == IMLibrary3.Enmu.MessageType.Notice) //如果发送通知消息给多个用户
            {
                string[] users = msg.to.Split(';');                         //获得要接收消息的用户数据
                if (users.Length > 0)
                {
                    foreach (string userID in users)
                    {
                        msg.to = userID;
                        SendMessageToUser(userID, msg);
                    }
                }
            }
            else if (msg.MessageType == IMLibrary3.Enmu.MessageType.broadcasting)//如果发送通知消息给所有用户
            {
                BroadcastingMessageToOnlineUser(msg);
            }
        }
Пример #7
0
    public void Close()
    {
        Console.WriteLine("TCP server is closing...");

        if (this.open)
        {
            this.open = false;

            // stop listner
            this.listener.Stop();

            // stop server thread
            this.server.Abort();
            this.server.Join();

            // stop all session threads and close the sessions
            while (this.sessions.Count > 0)
            {
                // stop session thread
                Thread th = (Thread)this.sessionThreads[0];
                th.Abort();
                th.Join();
                this.sessionThreads.Remove(th);

                // close session
                TCPServerSession s = (TCPServerSession)this.sessions[0];
                s.Close();
                this.sessions.Remove(s);
            }
        }

        Console.WriteLine("TCP server closed");
    }
Пример #8
0
        private void fileSession_PacketReceived(object sender, TcpSessionEventArgs e)
        {
            if (e.Data.Length < 2)
            {
                return;
            }
            TCPServerSession Session = sender as TCPServerSession;

            if (DateTime.Now > Session.ConnectTime.AddSeconds(20))
            {//如果客户端连接服务器的时间大于20秒,则视为非法攻击,断开联接
                Session.Disconnect();
                Session.Dispose();
            }

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

            if (obj != null)             //如果收到的消息对像不为空
            {
                if (obj is ImageFileMsg) //文件传输
                {
                    onFileTransmit(obj as ImageFileMsg, Session);
                }
            }
            else //收到非法消息
            {
                OnBadCommand(Session);
            }
        }
Пример #9
0
 /// <summary>
 /// 处理非法入侵
 /// </summary>
 /// <param name="session"></param>
 private void OnBadCommand(TCPServerSession session)
 {
     session.BadCmd++;
     if (session.BadCmd > 3)//4不过3,如果收到坏消息大于3条,则视为非法攻击,断掉TCP连接
     {
         session.Disconnect();
         session.Dispose();
     }
 }
Пример #10
0
        /// <summary>
        /// 处理用户请求更改在线状态
        /// </summary>
        /// <param name="presence"></param>
        /// <param name="session"></param>
        private void onPresence(Presence presence, TCPServerSession session)
        {
            if (presence.ShowType == IMLibrary3.Enmu.ShowType.Invisible)//如果用户隐身,则将用户状态设置为离线发送给其他用户
            {
                presence.ShowType = IMLibrary3.Enmu.ShowType.Offline;
            }

            BroadcastingMessageToOnlineUser(presence);
        }
Пример #11
0
 /// <summary>
 /// 处理用户获取企业组织架构分组信息请求
 /// </summary>
 /// <param name="orgGroups"></param>
 /// <param name="session"></param>
 private void onOrgGroups(Groups orgGroups, TCPServerSession session)
 {
     #region 新算法
     foreach (string str in orgVersion.GroupsXML.ToArray())
     {
         SendMessageToUser(orgGroups.from, str);//发送用户信息
     }
     #endregion
 }
Пример #12
0
 /// <summary>
 /// 通知客户端到文件服务器下载已上传完成的文件
 /// </summary>
 /// <param name="FileMsg"></param>
 /// <param name="session"></param>
 private void onTCPImageFile(TCPImageFile msg, string XMLMsg, TCPServerSession session)
 {
     if (msg.MessageType == IMLibrary3.Enmu.MessageType.User)//如果消息发送给用户
     {
         SendMessageToUser(msg.to, XMLMsg);
     }
     else if (msg.MessageType == IMLibrary3.Enmu.MessageType.Group)
     {
         SendMessageToRoom(msg.from, msg.to, XMLMsg);
     }
 }
Пример #13
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)
                {
                    Presence presence = new Presence();
                    presence.from     = user.UserID;
                    presence.ShowType = IMLibrary3.Enmu.ShowType.Offline;
                    BroadcastingMessageToOnlineUser(presence);//告诉在线者用户已经离线
                }
            }
        }
Пример #14
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));//触发用户离线事件
                    }
                }
            }
        }
Пример #15
0
        /// <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);                //将删除的用户广播给所有在线用户
                }
            }
        }
Пример #16
0
        /// <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);
            }
        }
Пример #17
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) //登录请求
                {
                    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);
            }
        }
Пример #18
0
        /// <summary>
        /// 处理用户请求创建或更新群
        /// </summary>
        /// <param name="changeRoom"></param>
        /// <param name="session"></param>
        private void onChangeRoom(ChangeRoom changeRoom, TCPServerSession session)
        {
            UserVcard requestUser = session.Tag as UserVcard;                                           //获得请求用户

            if (changeRoom.type == type.New && requestUser.CreatedRoomsCount < 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 = changeRoom.from; //创建者为请求者

                        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 == changeRoom.from)//如果群创建者为请求用户
                {
                    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, IMLibrary3.Protocol.Factory.CreateXMLMsg(changeRoom)); //通知群内原用户,群信息已经修改

                    DBHelper.UpdateRoom(room);
                }
                #endregion
            }
        }
Пример #19
0
 /// <summary>
 /// 转发文件传输消息
 /// </summary>
 /// <param name="FileMsg"></param>
 /// <param name="session"></param>
 private void onPFile(PFile msg, string XMLMsg, TCPServerSession session)
 {
     SendMessageToUser(msg.to, XMLMsg);
 }
Пример #20
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);
            }
        }
Пример #21
0
        /// <summary>
        /// 文件传送
        /// </summary>
        /// <param name="FileTransmit"></param>
        /// <param name="session"></param>
        private void onFileTransmit(ImageFileMsg FileMsg, TCPServerSession session)
        {
            if (FileMsg.Length > 1024000 || FileMsg.Length < 0)
            {
                return;                                                //如果所传输的文件大于1M或无大小则为非法请求退出
            }
            ServerImage image        = getServerImage(FileMsg.MD5);
            string      fullFileName = System.Windows.Forms.Application.StartupPath + "\\Images\\" + FileMsg.MD5 + FileMsg.Extension;//标记文件路径

            #region 在内存中为文件创建空间
            if (FileMsg.type == type.New)                               //上传文件请求
            {
                if (image == null)                                      //如果服务器内存中无此文件
                {
                    image = new ServerImage(FileMsg.MD5);               //创建内存文件
                    Images.Add(image.MD5, image);                       //将内存文件添加到文件下载服务区
                    if (File.Exists(fullFileName))                      //如果文件已在服务器硬盘中
                    {
                        image.Data         = OpFile.Read(fullFileName); //将文件数据全部读取到内存
                        image.Length       = image.Data.Length;         //设置准确的文件长度
                        image.uploadLength = image.Length;              //标记文件已经全部上传完成
                        FileMsg.type       = type.over;                 //标识文件已经传输完成,通知客户端停止上传
                        sendFileMsg(FileMsg, session);                  //通知客户端文件已经上传完成
                        session.Disconnect();                           //断开客户端的TCP连接
                    }
                    else
                    {
                        image.Extension = FileMsg.Extension;
                        image.Length    = FileMsg.Length;
                        image.Name      = FileMsg.Name;
                        image.userID    = FileMsg.from;
                        image.Data      = new byte[image.Length]; //创建内存空间

                        FileMsg.type       = type.set;            //通知客户端上传
                        FileMsg.LastLength = 0;                   //上传位置从零开始
                        sendFileMsg(FileMsg, session);            //通知客户端可以上传文件
                    }
                }
                else//如果服务器内存中有此文件
                {
                    FileMsg.type = type.over;//标识文件已经传输完成,通知客户端停止上传
                    sendFileMsg(FileMsg, session); //通知客户端文件已经上传完成
                    session.Disconnect();          //断开客户端的TCP连接
                }
            }
            #endregion

            #region  载文件
            if (FileMsg.type == type.get)                                  //下载文件请求
            {
                if (image == null)                                         //如果内存中无文件
                {
                    if (File.Exists(fullFileName))                         //如果文件已在服务器硬盘中
                    {
                        image              = new ServerImage(FileMsg.MD5); //创建内存文件
                        image.MD5          = FileMsg.MD5;
                        image.Data         = OpFile.Read(fullFileName);    //将文件数据全部读取到内存
                        image.Length       = image.Data.Length;            //设置准确的文件长度
                        image.uploadLength = image.Length;                 //标记文件已经全部上传完成
                        Images.Add(image.MD5, image);                      //将内存文件添加到文件下载服务区
                    }
                }

                if (image != null && FileMsg.LastLength < image.Data.Length) //如果内存中有文件
                {
                    if (FileMsg.LastLength + 10240 > image.Data.Length)
                    {
                        FileMsg.fileBlock = new byte[image.Data.Length - FileMsg.LastLength];//要发送的缓冲区
                    }
                    else
                    {
                        FileMsg.fileBlock = new byte[10240];                                                               //要发送的缓冲区
                    }
                    Buffer.BlockCopy(image.Data, (int)FileMsg.LastLength, FileMsg.fileBlock, 0, FileMsg.fileBlock.Length); //将其保存于Buffer字节数组

                    FileMsg.type        = type.get;                                                                        //下载标记
                    FileMsg.LastLength += FileMsg.fileBlock.Length;
                    sendFileMsg(FileMsg, session);

                    if (FileMsg.LastLength == image.Data.Length)
                    {
                        FileMsg.type      = type.over;//标记下载完成
                        FileMsg.fileBlock = null;
                        sendFileMsg(FileMsg, session);
                        session.Disconnect();
                    }
                }
            }
            #endregion

            #region   文件
            if (FileMsg.type == type.set)//上传文件内容
            {
                if (image.uploadLength + FileMsg.fileBlock.Length > image.Length)
                {
                    return;
                }

                Buffer.BlockCopy(FileMsg.fileBlock, 0, image.Data, (int)image.uploadLength, FileMsg.fileBlock.Length); //将收到的数据保存于Buffer字节数组

                image.uploadLength += FileMsg.fileBlock.Length;                                                        //设置最后一次上传文件的末尾长度

                FileMsg.LastLength = image.uploadLength;                                                               //告诉客户端已上传的文件位置
                FileMsg.fileBlock  = null;

                if (image.uploadLength == image.Length)//如果文件上传完成
                {
                    OpFile.Write(image.Data, fullFileName);
                    FileMsg.type = type.over;      //标识文件已经传输完成,通知客户端停止上传
                    sendFileMsg(FileMsg, session); //通知客户端文件已经上传完成
                    session.Disconnect();          //断开客户端的TCP连接
                }
                else
                {
                    sendFileMsg(FileMsg, session);//通知客户端上传文件下一数据包
                }
            }
            #endregion
        }
Пример #22
0
 /// <summary>
 /// 发送消息给一个用户
 /// </summary>
 /// <param name="Session">TCP客户端</param>
 /// <param name="e">object</param>
 public void SendMessage(TCPServerSession Session, object e)
 {
     tcpMessageServer.SendMessageToSession(Session, Factory.CreateXMLMsg(e));
 }
Пример #23
0
 /// <summary>
 /// 发送消息给一个用户
 /// </summary>
 /// <param name="Session">用户</param>
 /// <param name="Message">消息文本</param>
 public void SendMessage(TCPServerSession Session, string XMLMsg)
 {
     tcpMessageServer.SendMessageToSession(Session, XMLMsg);
 }
Пример #24
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); //将删除的用户广播给所有在线用户
            }
        }