⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servicemain.cs

📁 kuiMsg是一款用.net C# 开发的即时消息开源软件,适合.net即时消息软件开发者用。 主要功能: 支持文件传输(p2p); 支持GIF动画表情( 彻底消除闪屏 :) );
💻 CS
📖 第 1 页 / 共 3 页
字号:
                this.sendMsgToOneUser(6, buf, e.IP, e.Port);//告诉用户与服务器保持联接状态
                //this.WirteLog("告诉用户" + this.systemUsers[msg.ID].UserID + "与服务器保持联接状态");
            //}
            //else
            //    this.WirteLog("用户" + msg.userId + "断开与服务器的联接。");
        }
        #endregion

        #region 用户登录过程,如果成功则返回部门数,不成功则返回0
        /// <summary>
        /// 用户登录过程,如果成功则返回部门数,不成功则返回0
        /// </summary>
        /// <param name="e"></param>
        private void onUserLogin(DataArrivalEventArgs e) 
        {
            IMLibrary.ServerMsg cmsg =  IMLibrary.Serializers.ByteToObj(e.Data) as ServerMsg;
            if (cmsg == null)
            {
                this.WirteLog("系统收到数据,但无法识别的消息类型。非法用户-" + e.IP.ToString() + ":" + e.Port.ToString());
                return;
            }

            string [] User=IMLibrary.TextEncoder.bytesToText(cmsg.msgContent).Split('|');
            string userID = User[0];
            string password =  User[1] ;//获得用户发送的密码
            string departmentVersion = User[2];
            string usersVersion = User[3];

            //object obj;

            //IMLibrary.SqlData.DataAccess.ExecProc("IsMatchingUser", out obj, userID, password);//执行存储过程,检查用户密码是否匹配,即是否正确
            bool t=false ; //

            if (!t || IMLibrary.DNS.IsDomainUser(userID, password, "gz.com")) //(this.IsDomainUser(userID, password))//是真密码
            {
                IMLibrary.UserInfo user = findUser(userID);
                if (user != null)
                {
                    if (user.State != 0)//如果用户已经在线
                        this.sendMsgToOneUser(13, IMLibrary.TextEncoder.intToBytes(0), user.IP, user.Port);//通知其已在别处登录,让原先登录的退出

                    this.UpdateUserInfo(user, e.IP, e.Port, 1);//更新登录用户在线信息

                    this.sendDepVersionToUser(e.IP, e.Port);//发送部门版本号给登录用户并告之登录成功

                    if (departmentVersion == this.VersionDepAndUser.departmentVersion.ToString() && usersVersion == this.VersionDepAndUser.usersVersion.ToString())//如果组织机构与用户版本号相同则发送在线用户信息给上线用户
                    {
                        uint count = 0;
                        UserCollections tempUsers = new UserCollections();
                        for (uint index = 1; index < this.systemUsers.Length; index++)
                        {
                            if (this.systemUsers[index].State != 0)//如果用户在线,则加入在线用户集合
                            {
                                tempUsers.add(this.systemUsers[index]);
                                count++;
                                if (count == 5)
                                {
                                    byte[] buf = IMLibrary.Serializers.ObjToByte(tempUsers);
                                    this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
                                    System.Threading.Thread.Sleep(10);
                                    this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
                                    ///连续两次发送
                                    count = 0;
                                    tempUsers = new UserCollections();
                                }
                            }
                        }

                        if (tempUsers != null)
                        {
                            byte[] buf = IMLibrary.Serializers.ObjToByte(tempUsers);
                            this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
                            System.Threading.Thread.Sleep(10);
                            this.sendMsgToOneUser(23, buf, e.IP, e.Port);//将在线用户集合发送给上线用户
                            ///连续两次发送
                        }
                    }
                    this.sendLoginUserToUsers(user);//发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
                    //this.WirteLog("用户" + userID + "登录成功!" + e.IP.ToString() + ":" + e.Port.ToString());
                }
            }
            else
            {
                byte[] buf = new byte[1];
                buf[0] = 0;
                this.sendMsgToOneUser(0, buf, e.IP, e.Port);//告诉用户密码错误
                this.WirteLog("用户" + userID + "密码错误!" + e.IP.ToString() + ":" + e.Port.ToString());
            }
        }
        #endregion

        #region 发送部门版本号给用户
        /// <summary>
        /// 发送部门版本号给用户
        /// </summary>
        /// <param name="ip">用户IP</param>
        /// <param name="port">用户端口</param>
        private void sendDepVersionToUser(System.Net.IPAddress ip, int port)
        {
             
            byte[] buf =  IMLibrary.Serializers.ObjToByte(this.VersionDepAndUser );
            this.sendMsgToOneUser(5, buf, ip, port);//发送部门版本号给登录用户并告之登录 成功
            //this.WirteLog("发送部门版本号给登录用户并告之登录成功"+ buf.Length.ToString());
        }

        /// <summary>
        /// 发送部门版本号给用户
        /// </summary>
        /// <param name="userID">用户ID</param>
        private void sendDepVersionToUser(string userID)
        {
            IMLibrary.UserInfo user = this.findUser(userID);
            if (user != null)
            {
                byte[] buf =  IMLibrary.Serializers.ObjToByte(this.VersionDepAndUser );
                this.sendMsgToOneUser(5, buf, user.IP, user.Port);//发送部门版本号给用户
            }
        }
        #endregion

        #region 发送部门数给用户
        /// <summary>
        /// 发送部门数给用户
        /// </summary>
        /// <param name="ip">用户IP</param>
        /// <param name="port">用户端口</param>
        private void sendDepCoutToUser(System.Net.IPAddress ip,int port)
        {
                IMLibrary.ServerMsg msg = new IMLibrary.ServerMsg(0,IMLibrary.TextEncoder.intToBytes(this.deps.Count));
                byte[] buf =  IMLibrary.Serializers.ObjToByte (msg);
                this.sendMsgToOneUser(7, buf, ip, port);//发送部门数给用户
        }

        /// <summary>
        /// 发送部门数给用户
        /// </summary>
        /// <param name="userID">用户ID</param>
        //private void sendDepCoutToUser(string userID)
        //{
        //    IMLibrary.UserInfo user=this.findUser(userID);
        //    if (user != null)
        //    {
        //        IMLibrary.ServerMsg msg = new IMLibrary.ServerMsg(0,null,IMLibrary.TextEncoder.intToBytes(this.deps.Count));
        //        byte[] buf =  IMLibrary.Serializers.ObjToByte(msg);
        //        this.sendMsgToOneUser(7, buf, user.IP, user.Port);//发送部门数给用户
        //    }
        //}
        #endregion

        #region 更改用户在线信息(集合中更改)
        /// <summary>
        /// 更新用户在线信息
        /// </summary>
        /// <param name="userID">用户ID</param>
        /// <param name="ip">用户IP</param>
        /// <param name="port">用户端口</param>
        /// <param name="state">用户在线状态</param>
        /// <returns>返回更改是否成功或其它信息</returns>
        private void UpdateUserInfo(string userID, System.Net.IPAddress ip, int port, byte state)
        {
            IMLibrary.UserInfo user = findUser(userID);
            if (user != null)
            {
                user.IP = ip;
                user.Port = port;
                user.State = state;
                user.tempState = state;
            }
        }

        private void UpdateUserInfo(IMLibrary.UserInfo user, System.Net.IPAddress ip, int port, byte state)
        {
            if (user != null)
            {
                user.IP = ip;
                user.Port = port;
                user.State = state;
                user.tempState = state;
            }
        }
        #endregion

        #region 在用户集合中查找用户 
        /// <summary>
        /// 在用户集合中查找用户
        /// </summary>
        /// <param name="userID">用户ID</param>
        /// <returns>返回用户信息</returns>
        private IMLibrary.UserInfo findUser(string userID)
        {
            IMLibrary.UserInfo user=null ;
            for (uint index = 1; index < systemUsers.Length;index ++ )
                if (systemUsers[index].UserID.ToLower() == userID.ToLower())
                    return  systemUsers[index];
                 
            return user;
        }
        #endregion

        #region 发送消息给一个用户sendMsgToOneUser(Byte msgInfo ,byte[] msgContent, System.Net.IPAddress Ip, int Port)
        /// <summary>
        /// 发送消息给一个用户
        /// </summary>
        /// <param name="msgInfo">消息类型</param>
        /// <param name="msgContent">消息内容</param>
        /// <param name="Ip">接收者IP</param>
        /// <param name="Port">接收者端口</param>
        public void sendMsgToOneUser(Byte msgInfo ,byte[] msgContent, System.Net.IPAddress Ip, int Port)//给一个用户发送消息 
        {
            byte[] buf = new byte[msgContent.Length + 2];
            buf[0] = 255;//合法用户标识
            buf[1] = msgInfo;//消息类型
            Buffer.BlockCopy(msgContent, 0, buf, 2, msgContent.Length);
            IMLibrary.SockUDP sockTemp = new SockUDP();
            sockTemp.Send(Ip, Port, buf);
            sockTemp.Dispose();
        }

        public void sendMsgToOneUser(byte[] msgContent, System.Net.IPAddress Ip, int Port)//给一个用户发送消息 
        {
            IMLibrary.SockUDP sockTemp = new SockUDP();
            sockTemp.Send(Ip, Port, msgContent);
            sockTemp.Dispose();
        }
        #endregion

        #region 发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
        /// <summary>
        ///  发送登录用户的在线信息资料给所有在线用户,通知其有新用户登录
        /// </summary>
        /// <param name="Uses">要发送的用户信息</param>
        private void sendLoginUserToUsers(IMLibrary.UserInfo user)
        {
            byte[] buf = IMLibrary.Serializers.ObjToByte(user);
            for (uint index = 1; index < systemUsers.Length; index++)
                if (systemUsers[index].State != 0)
                {
                    this.sendMsgToOneUser(9, buf, systemUsers[index].IP, systemUsers[index].Port);
                    System.Threading.Thread.Sleep(10);
                }
        }
        #endregion

        #region 将消息写入日志文件 WirteLog(string str)
        /// <summary>
        /// LanMsg写日志函数
        /// </summary>
        /// <param name="str">要写入的日志内容字符串</param>
        private void WirteLog(string str)
        {
            FileStream fs = new FileStream(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log.txt", FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter _streamWriter = new StreamWriter(fs);
            _streamWriter.BaseStream.Seek(0, SeekOrigin.End);
            _streamWriter.WriteLine(str + " " + DateTime.Now.ToString() + "\n");
            _streamWriter.Flush();
            _streamWriter.Close();
            fs.Close();
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -