基于Socket通信的BS结构文件服务器客户端的简易程序(3)

来源:互联网 发布:海川新盟软件下载 编辑:程序博客网 时间:2024/06/05 23:04

http://blog.csdn.net/weixingstudio/article/details/7042290

 

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Text;using System.Windows.Forms;using System.Net;using System.Collections;using System.Net.Sockets;using System.Threading;using System.IO;using System.Xml;using System.Collections.Specialized;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;namespace Server{    public partial class Server_Form : Form    {        // 服务器地址默认为10.108.13.27, 端口为8888        private int PORT = 8888;        private string ip_server = "10.108.13.27";        private IPAddress ipAddress_Server = null;        // 维护一个所有用户客户端的哈希表        private Hashtable client_hashtable = null;        // 监听端口的类        private TcpListener listener_server = null;        // 监听端口用的线程        private Thread thread_port_listening = null;        private Thread client_Thread = null;        // 用于目录管理的基本路径        private string config_path=Environment.CurrentDirectory + "\\config";        private string user_info=Environment.CurrentDirectory+ "\\config" + "\\user_config";        // 保存用户名和密码的文件        private string user_account_path = Environment.CurrentDirectory + "\\config" + "\\user_config" + "\\user_account.txt";        Add_user add_user_form = null;        //private long maxFileBuffer = 1024 * 1024;//最大可以传送大小为1M 的文件,暂时这样处理,减少缓冲区的工作量        private int fileBuffer_eachTime_sended = 8 * 1024;// 每次最多传送8K , 先这样测测        delegate void setOnlineUserInfoDelegate(string s);        delegate void showInfoDelegate(string s);        delegate void clearOnlineUserDelegate();        // 服务器和客户机协约的通信协议        // "00" 同意连接        // "01" 拒绝连接        // "10" 用户请求离线        // "11" 通知用户刷新在线用户列表        // "12" 请求在线用户列表        // "22" 通知用户有其他的用户上线了        // "23" 通知所有用户有人离线        // "33" 用户请求上传文件        // "34" 文件上传成功        // "44" 用户请求文件列表        // "45" 给用户返回文件列表        // "55" 用户请求下载文件        // "56" 给用户发送文件        // "66" 用户请求删除文件        // "67" 删除文件成功        public Server_Form()        {            InitializeComponent();            InitServerForm();            // 当前窗口关闭是进行的操作            this.FormClosed += new FormClosedEventHandler(Server_Form_FormClosed);            // 关闭线程安全检查,否则会出很多线程错误            //Form.CheckForIllegalCrossThreadCalls = false;            // 初始化相关配置            string currentPath = Environment.CurrentDirectory;            string fileFolder = currentPath + "\\" + "files";            string configFolder = currentPath + "\\" + "config";            bool test = Directory.Exists(fileFolder);            if (test)            {                // 存在目录则不进行操作            }            else            {                // 创建各个用户存放文件的目录                Directory.CreateDirectory(fileFolder);            }            if (!Directory.Exists(configFolder))            {                string user_config_folder = configFolder + "\\" + "user_config";                Directory.CreateDirectory(configFolder);                Directory.CreateDirectory(user_config_folder);            }            string userXMLFile = configFolder + "\\user_config" + "\\user.xml";            if (!File.Exists(userXMLFile))            {                try                {                    // 创建用户账户文件                    XmlDocument doc = new XmlDocument();                    XmlDeclaration xmld = doc.CreateXmlDeclaration("1.0", "GB2312", null);                    XmlElement root = doc.CreateElement("user");                    doc.AppendChild(xmld);                    doc.AppendChild(root);                    doc.Save(configFolder + "\\user_config\\" + "user.xml");                }                catch (FileLoadException)                { }                catch (FileNotFoundException)                { }                finally                {                    //                }            }        }        /// <summary>        /// 当窗体关闭时,进行处理操作        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        void Server_Form_FormClosed(object sender, FormClosedEventArgs e)        {            // 关闭窗口时,判断端口监听线程是否已经关闭,如果端口监听线程没有关闭,则关闭端口监听线程            if (thread_port_listening!=null)            {                // 关闭监听服务                //listener_server.Stop();                // 关闭线程                thread_port_listening.Abort();            }        }        /// <summary>        ///  初始化窗口的一些参数        /// </summary>        private void InitServerForm()        {            this.textBox_ip.Text = "10.108.13.27";            this.textBox_port.Text = "8888";        }        /// <summary>        /// 开启监听服务        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button1_Click(object sender, EventArgs e)        {            // 校验 参数            bool isTheParamsRight=VerifyInputParams();            // 如果参数不正确,则提示错误信息            if (!isTheParamsRight)            {                //MessageBox.Show("请确认输入正确的参数信息","info",MessageBoxButtons.OK,MessageBoxIcon.Information);                return;            }            // 监听线程没有创建实例,服务还没有开始            if (thread_port_listening == null)            {                // 显示提示消息                this.richTextBox1.AppendText("start service:" + ip_server + ":" + PORT + '\n');                // 初始化IPAddress                ipAddress_Server = IPAddress.Parse(ip_server);                // 初始化客户端Hashtable                client_hashtable = new Hashtable();                // 初始化端口监听类                listener_server = new TcpListener(ipAddress_Server, PORT);                thread_port_listening = new Thread(new ThreadStart(ListenPort));                this.richTextBox1.AppendText("new listening thread started" + '\n');                thread_port_listening.Start();            }            else            {                this.richTextBox1.AppendText("service already started! pls do not start any more!!!"+'\n');            }        }        /// <summary>        /// 开始监听端口,在一个新的线程中        /// </summary>        private void ListenPort()        {            // 开始监听服务器端口,接受客户端的连接            listener_server.Start();            string info = "service start successfully." + '\n';            // 线程安全地显示相关信息            showInfo_richbox1(info);            // 显示在线用户人数            show_Online_User();            try            {                // 开始不停地监听端口,并为每一个连接的客户端创建一个新的线程                while (true)                {                    // 定义一个接受信息缓冲区                    // 缓冲区大小为8K                    byte[] info_buffer = new byte[8096];                    // 建立一个和客户端进行会话的Socket连接                    Socket newClinet = listener_server.AcceptSocket();                    // 获取用户提交的用户名                    newClinet.Receive(info_buffer);                    newClinet.Send(new byte[] { 1, 1 });                    string user_Name = Encoding.Unicode.GetString(info_buffer).TrimEnd('\0');                    // 获得用户提交的密码                      byte[] passbuffer = new byte[100];                    newClinet.Receive(passbuffer);                    string user_Password = Encoding.Unicode.GetString(passbuffer).TrimEnd('\0');                    // 判断用户是否有权限连接服务器                    bool isUserAllowedConnect = VerifyUser(user_Name, user_Password);                    if (isUserAllowedConnect)                    {                        // 用户是合法的连接用户                        // 发送允许连接代码                        newClinet.Send(Encoding.Unicode.GetBytes("success"));                        // 为用户建立一个专用的线程进行通信                        // 将登录的用户记录在hashtable中                        client_hashtable.Add(user_Name, newClinet);                        client_Thread = new Thread(new ParameterizedThreadStart(tcpClient_Thread));                        // 开始和用户通信的专用线程                        try                        {                            client_Thread.Start(user_Name);                        }                        catch (ThreadStartException)                        {                            //                        }                        // 通知所有的用户XX上线了                        // 先给每个用户发送有人上线指令                        foreach (DictionaryEntry de in client_hashtable)                        {                            string name = de.Key.ToString();                            Socket s = de.Value as Socket;                            string temp = "用户:" + user_Name + "上线了!";                            if (!name.Equals(user_Name))                            {                                s.Send(new byte[] { 2, 2 }); // 发送有人上线指令                                s.Send(Encoding.Unicode.GetBytes(temp));                            }                        }                        // 在信息里面显示登录信息                        string login_info = '\n' + user_Name + "登录了" + '\n';                        showInfo_richbox1(login_info);                        // 刷新在线用户列表                        show_Online_User();                    }                    else                    {                        // 不合法的用户, 发送拒绝连接代码                        newClinet.Send(Encoding.Unicode.GetBytes("failed"));                        continue;//结束本次监听循环                    }                }            }            catch (ThreadAbortException)            {                //            }            finally            {                //            }        }        /// <summary>        /// 负责和登录用户进行通信的专用线程        /// </summary>        /// <param name="userName">传递用户名</param>        private void tcpClient_Thread(object userName)        {            string name = userName as string;            // 获得和用户通信的Socket            try            {                Socket clientSocket = client_hashtable[userName] as Socket;                if (clientSocket != null)                {                    // 不停的接收用户请求并做出相应响应,接收和响应是对应的一对一的                    while (clientSocket.Connected)                    {                        byte[] commandBuffer = new byte[4];                        // 接收用户发过来的命令请求                        if (!clientSocket.Connected)                        {                            //                             break;                        }                        clientSocket.Receive(commandBuffer);                        // 解码命令                         string cmd = DecodingBytes(commandBuffer);                        switch (cmd)                        {                            // 用户请求离线                            case "10":                                {                                    // 关闭用户的Socket连接,然后清理用户的hashtable                                    client_hashtable.Remove(userName);                                    string info = "\n用户" + name + "离线了\n";                                    // 在信息里面显示登录信息                                    showInfo_richbox1(info);                                    // 通知所有的用户XX离线了, 给每个Socket连接发送消息,需要使用每个Socket连接各自的Socket                                    foreach (DictionaryEntry de in client_hashtable)                                    {                                        Socket s = de.Value as Socket;                                        if (!de.Key.Equals(userName))                                        {                                            // 先给各个用户发送有人离线指令                                            s.Send(new byte[] { 2, 3 });                                            s.Send(Encoding.Unicode.GetBytes(info));                                        }                                    }                                    // 刷新在线用户列表                                    show_Online_User();                                    // 终止当前线程                                    Thread.CurrentThread.Abort();                                    break;                                }                            // 用户请求在线用户列表                            case "12":                                {                                    byte[] onLineUserBuffer = SerializeOnlineList();                                    // 先给客户机发送响应信号,通知客户机刷新用户列表                                    clientSocket.Send(new byte[] { 1, 1 });                                    // 发送在线用户列表                                    clientSocket.Send(onLineUserBuffer);                                    break;                                }                            // 用户请求上传文件                            case "33":                                {                                    try                                    {                                        //                                         // 存放文件到用户的文件夹目录                                        byte[] fileBuffer = new byte[fileBuffer_eachTime_sended];                                        byte[] fileNameBuffer = new byte[256];                                        // 接收文件名                                         clientSocket.Receive(fileNameBuffer);                                        string fileName = Encoding.Unicode.GetString(fileNameBuffer).TrimEnd('\0');                                        //// 接收要传送的次数                                        //byte[] times_byte = new byte[8];                                        //clientSocket.Receive(times_byte);                                        //string temp = Encoding.Unicode.GetString(times_byte).TrimEnd('\0');                                        //int number_of_receive = int.Parse(temp);                                        // 接收总的文件大小                                        byte[] fileSize_byte = new byte[16];                                        clientSocket.Receive(fileSize_byte);                                        string fileSize_string = Encoding.Unicode.GetString(fileSize_byte).TrimEnd('\0');                                        long sumFileSize = Convert.ToInt32(fileSize_string, 10);                                        // 由文件的大小计算传送的次数                                        long number_of_receive = sumFileSize / fileBuffer_eachTime_sended + 1;                                        //                                         string filePath = Environment.CurrentDirectory + "\\files";                                        string userPath = filePath + "\\" + name + "\\" + fileName; // 文件的完全存储路径                                        FileStream file = File.Open(userPath, FileMode.Create, FileAccess.ReadWrite);                                        BinaryWriter bw = new BinaryWriter(file);                                        // 向文件中写数据                                        if (number_of_receive == 1)                                        {                                            // 只需要传送一次                                            int FileSize = clientSocket.Receive(fileBuffer);                                            bw.Write(fileBuffer, 0, FileSize);                                            bw.Flush();                                        }                                        else if (number_of_receive > 1)                                        {                                            // 需要多次接收文件                                            for (int i = 1; i < number_of_receive; i++)                                            {                                                clientSocket.Receive(fileBuffer);                                                bw.Write(fileBuffer, 0, fileBuffer_eachTime_sended);                                                bw.Flush();                                            }                                            // 通过总的文件大小,计算最后传送的个数                                             int remainBytes = (int)(sumFileSize % fileBuffer_eachTime_sended);                                            byte[] newBuffer = new byte[remainBytes];                                            clientSocket.Receive(newBuffer);                                            bw.Write(newBuffer, 0, remainBytes);                                            bw.Flush();                                        }                                        bw.Close();                                        file.Close();                                        // 判断文件是否上传成功                                        bool success = File.Exists(userPath);                                        if (success)                                        {                                            // 文件上传成功                                            // 将文件的相关信息存储到配置文件,fileName,FileSize,time                                            FileStream fs = File.Open(userPath, FileMode.Open);                                            long fz = fs.Length;                                            fs.Close();                                            DateTime dt = DateTime.Now;                                            XmlDocument doc = new XmlDocument();                                            doc.Load(filePath + "\\" + name + "\\" + "config.xml");                                            XmlElement root = doc.DocumentElement;                                            XmlElement child = doc.CreateElement("file");                                            child.SetAttribute("FileName", fileName);                                            child.SetAttribute("FileSize", fz.ToString() + "B");                                            child.SetAttribute("Time", dt.ToString());                                            root.InsertAfter(child, root.LastChild);                                            doc.Save(filePath + "\\" + name + "\\" + "config.xml");                                            // 文件上传成功,给用回返回确认信息                                            //clientSocket.Send(Encoding.Unicode.GetBytes("upload_completed"));                                            clientSocket.Send(new byte[] { 3, 4 });                                        }                                    }                                    catch (FileLoadException)                                    {                                        //                                    }                                    catch (FileNotFoundException)                                    {                                        //                                    }                                    break;                                }                            // 用户请求服务器文件列表                            case "44":                                {                                    string configPath = Environment.CurrentDirectory + "\\files" + "\\" + name + "\\" + "config.xml";                                    XmlDocument doc = new XmlDocument();                                    doc.Load(configPath);                                    XmlElement root = doc.DocumentElement;                                    StringCollection cs = new StringCollection();                                    foreach (XmlElement child in root.ChildNodes)                                    {                                        string FileName = child.GetAttribute("FileName");                                        string FileSize = child.GetAttribute("FileSize");                                        string datetime = child.GetAttribute("Time");                                        cs.Add(FileName);                                        cs.Add(FileSize);                                        cs.Add(datetime);                                    }                                    // 将文件列表序列化返回给用户                                    IFormatter format = new BinaryFormatter();                                    MemoryStream ms = new MemoryStream();                                    format.Serialize(ms, cs);                                    byte[] result = ms.ToArray();                                    ms.Close();                                    // 发送列表之前先发送传送文件列表命令                                    clientSocket.Send(new byte[] { 4, 5 });                                    // 发送文件列表                                    clientSocket.Send(result);                                    break;                                }                            // 用户下载文件请求                            case "55":                                {                                    byte[] fileNameBuffer = new byte[128];                                    clientSocket.Receive(fileNameBuffer);                                    // 获得要下载的文件名                                    string fileName = Encoding.Unicode.GetString(fileNameBuffer).TrimEnd('\0');                                    string filePath = Environment.CurrentDirectory + "\\files" + "\\" + name + "\\" + fileName;                                    try                                    {                                        FileStream fs = File.Open(filePath, FileMode.Open);                                        long fileSize = fs.Length;                                        BinaryReader br = new BinaryReader(fs);                                        // 发送给用户传送文件的命令                                        clientSocket.Send(new byte[] { 5, 6 });                                        // 传送文件, 分开传送,如果文件大于8k,则分为8k为一个传送单位                                        // 用来存储即将发送的数据                                        byte[] bytes_tobesend = new byte[fileBuffer_eachTime_sended];  // 最大8k                                        // 计算需要发送的次数                                        int times_tobesended = (int)(fileSize / fileBuffer_eachTime_sended) + 1;                                        //string times_string = times_tobesended.ToString();                                        //// 传送给客户端需要发送的次数                                        //byte[] times_byte = Encoding.Unicode.GetBytes(times_string);                                        //clientSocket.Send(times_byte);                                        //                                         //  传送总的文件大小                                        clientSocket.Send(Encoding.Unicode.GetBytes(fileSize.ToString().TrimEnd('\0')));                                        // 开始传送文件                                        if (times_tobesended == 1)                                        {                                            // 只需要传送一次                                            byte[] bytes_Only1time = new byte[fileSize];                                            br.Read(bytes_Only1time, 0, (int)fileSize);                                            clientSocket.Send(bytes_Only1time);                                        }                                        else if (times_tobesended > 1)                                        {                                            // 需要传送的次数>1, 需要分多次传送                                            for (int i = 1; i < times_tobesended; i++)                                            {                                                bytes_tobesend = br.ReadBytes(fileBuffer_eachTime_sended);                                                //br.Read(bytes_tobesend, 0, fileBuffer_eachTime_sended);                                                if (clientSocket.Connected)                                                {                                                    clientSocket.Send(bytes_tobesend);                                                }                                                else                                                {                                                    // 用户连接丢失,进行清理工作                                                    client_hashtable.Remove(name); // 在hashtable中移除用户                                                    string s = "\n 用户:" + name + "发生异常,失去连接\n";                                                    // 在提示框中提示消息                                                    showInfo_richbox1(s);                                                    // 终结当前线程                                                    Thread.CurrentThread.Abort();                                                }                                                //Thread.Sleep(10);                                            }                                            int remainedBytes = (int)(fileSize % fileBuffer_eachTime_sended); // 计算剩余的字节数                                            byte[] to_be_send_remain = new byte[remainedBytes];                                            to_be_send_remain = br.ReadBytes(remainedBytes);                                            //br.Read(bytes_tobesend, 0, remainedBytes);                                            clientSocket.Send(to_be_send_remain);                                        }                                        br.Close();                                        fs.Close();                                    }                                    catch (FileLoadException)                                    {                                        //                                    }                                    finally                                    {                                        //                                    }                                    break;                                }                            // 用户请求删除文件                            case "66":                                {                                    // 获取文件名                                    byte[] fileNameBuffer = new byte[128];                                    clientSocket.Receive(fileNameBuffer);                                    string fileName = Encoding.Unicode.GetString(fileNameBuffer).TrimEnd('\0');                                    // 获取要删除文件的路径                                    string filePath = Environment.CurrentDirectory + "\\files" + "\\" + name + "\\" + fileName;                                    File.Delete(filePath);                                    // 清理记录文档                                    string configPath = Environment.CurrentDirectory + "\\files" + "\\" + name + "\\" + "config.xml";                                    XmlDocument doc = new XmlDocument();                                    doc.Load(configPath);                                    XmlElement root = doc.DocumentElement;                                    foreach (XmlElement child in root.ChildNodes)                                    {                                        string filename = child.GetAttribute("FileName");                                        if (filename.Equals(fileName))                                        {                                            root.RemoveChild(child);                                            break;                                        }                                        continue;                                    }                                    doc.Save(configPath);                                    // 发送删除文件成功代码                                    clientSocket.Send(new byte[] { 6, 7 });                                    break;                                }                            default:                                {                                    break;                                }                        }                    } // end while                    if (!clientSocket.Connected)                    {                        // 用户连接丢失,进行清理工作                        client_hashtable.Remove(name); // 在hashtable中移除用户                        string s = "\n 用户:" + name + "发生异常,失去连接\n";                        // 在提示框中提示消息                        showInfo_richbox1(s);                        clientSocket = null;                        // 终结当前线程                        Thread.CurrentThread.Abort();                    }                }                else                {                    // todo?                }            }            catch (SocketException)            {                //                // 和用户的连接异常后,清理工作                // 用户连接丢失,进行清理工作                client_hashtable.Remove(name); // 在hashtable中移除用户                string s = "\n 用户:" + name + "发生异常,失去连接\n";                // 在提示框中提示消息                showInfo_richbox1(s);                // 显示在线用户人数                show_Online_User();                // 终结当前线程                Thread.CurrentThread.Abort();            }            finally            {                //             }        }        /// <summary>        /// 序列化在线列表,向客户端返回序列化后的字节数组        /// </summary>        /// <returns>序列化后的字节数组</returns>        private byte[] SerializeOnlineList()        {            StringCollection onlineList = new StringCollection();            foreach (object o in client_hashtable.Keys)            {                onlineList.Add(o as string);//转换语句            }            IFormatter format = new BinaryFormatter();//以二进制格式将对象或整个连接对象图形序列化和反序列化。            MemoryStream stream = new MemoryStream();            format.Serialize(stream, onlineList);//保持到内存流            byte[] ret = stream.ToArray();            stream.Close();            return ret;        }        /// <summary>        /// 将命令解码        /// </summary>        /// <param name="s"></param>        /// <returns></returns>        private string DecodingBytes(byte[] s)        {            return string.Concat(s[0].ToString(), s[1].ToString());        }        /// <summary>        /// 线程安全的在richTextBox中显示信息        /// </summary>        /// <param name="info"></param>        private void showInfo_richbox1(string info)        {            // 通过代理,线程安全的在控件中显示信息            if (this.richTextBox1.InvokeRequired)            {                // 通过代理,保证线程安全性                showInfoDelegate call = delegate(string s) { this.richTextBox1.AppendText(info); };                this.richTextBox1.Invoke(call,info);            }            else            {                this.richTextBox1.AppendText(info);            }            //            //if (this.onlineUserInfo.InvokeRequired)            //{            //    setOnlineUserInfoDelegate call = delegate(string s)            //    {            //        this.onlineUserInfo.Clear();            //        this.onlineUserInfo.AppendText(s);            //    };            //    this.onlineUserInfo.Invoke(call, info);            //}            //else            //{            //    this.onlineUserInfo.Clear();            //    this.onlineUserInfo.AppendText(info);            //}        }        /// <summary>        /// 判断用户是否有权限访问服务器        /// </summary>        /// <param name="user_Name"></param>        /// <param name="user_Password"></param>        /// <returns></returns>        private bool VerifyUser(string user_Name, string user_Password)        {            try            {                // 在用户管理文件中查询用户名,密码是否正确                XmlDocument doc = new XmlDocument();                doc.Load(".//config//user_config//user.xml");                XmlElement root = doc.DocumentElement;                foreach (XmlElement accout in root.ChildNodes)                {                    string name = accout.GetAttribute("name");                    string password = accout.GetAttribute("password");                    if (name.Equals(user_Name) && password.Equals(user_Password))                    {                        return true;                    }                }            }            catch (FileLoadException)            {                //            }            finally            {                //            }            return false;        }        /// <summary>        /// 关闭服务,结束端口监听        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void stop_service(object sender, EventArgs e)        {            if (listener_server != null)            {                // 如果不为空,则停止监听                this.richTextBox1.AppendText("\n服务结束!" + '\n');                listener_server.Stop();                listener_server = null;                // 结束监听线程 并且设为null                thread_port_listening.Abort();                thread_port_listening = null;                MessageBox.Show("服务终止","info");            }            if (client_hashtable != null)            {                // 停止监听以后,结束所有的在hashtable中的客户端                if (client_hashtable.Count != 0)                {                    // 关闭所有的会话连接                    foreach (Socket sesson in client_hashtable.Values)                    {                        sesson.Shutdown(SocketShutdown.Both);                    }                    // 清空hashtable                    client_hashtable.Clear();                    client_hashtable = null;                    this.richTextBox1.AppendText("client all removed!!!" + '\n');                }            }        }        /// <summary>        /// 显示在线用户的方法        /// </summary>        private void show_Online_User()        {            if (client_hashtable != null)            {                if (client_hashtable.Count != 0)                {                    //this.onlineUserInfo.Clear();                    clearOnlineUser();                    //this.onlineUserInfo.AppendText("当前在线的用户有:" + '\n');                    showOnlineUser("当前在线的用户有:");                    foreach (string name in client_hashtable.Keys)                    {                        string temp = name;                        //this.onlineUserInfo.AppendText(name + '\n');                        showOnlineUser(name);                    }                }                else                {                    // 不是线程安全的,容易出现错误                    //this.onlineUserInfo.Clear();                    //this.onlineUserInfo.AppendText("当前没有用户在线");                    setOnLineUserInfo();                }            }        }        private void showOnlineUser(string info)        {            if (this.onlineUserInfo.InvokeRequired)            {                showInfoDelegate call = delegate(string s) { this.onlineUserInfo.AppendText(s + '\n'); };                this.onlineUserInfo.Invoke(call, info);            }            else            {                this.onlineUserInfo.AppendText(info + '\n');            }        }        /// <summary>        /// 线程安全的清除在线用户信息        /// </summary>        private void clearOnlineUser()        {            if (this.onlineUserInfo.InvokeRequired)            {                clearOnlineUserDelegate call = delegate() { this.onlineUserInfo.Clear(); };                this.onlineUserInfo.Invoke(call);            }            else            {                this.onlineUserInfo.Clear();            }        }        /// <summary>        /// 线程安全的给控件添加信息        /// </summary>        private void setOnLineUserInfo()        {            string info = "当前没有用户在线";            if (this.onlineUserInfo.InvokeRequired)            {                 setOnlineUserInfoDelegate call = delegate(string s) {                    this.onlineUserInfo.Clear();                    this.onlineUserInfo.AppendText(s); };                this.onlineUserInfo.Invoke(call,info);            }            else            {                this.onlineUserInfo.Clear();                this.onlineUserInfo.AppendText(info);            }        }        /// <summary>        /// 校验用户输入的参数是否正确        /// </summary>        /// <returns></returns>        private bool VerifyInputParams()        {            if (textBox_ip.Text == "")            {                MessageBox.Show("请输入正确的IP","info",MessageBoxButtons.OK,MessageBoxIcon.Information);                return false;            }            this.ip_server = textBox_ip.Text;            if (textBox_port.Text == "" || (int.Parse(textBox_port.Text)) < 1023 || (int.Parse(textBox_port.Text)) > 65535)            {                MessageBox.Show("请输入正确的port", "info", MessageBoxButtons.OK, MessageBoxIcon.Information);                return false;            }            this.PORT = int.Parse(textBox_port.Text);            return true;        }        /// <summary>        /// 添加用户        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button_add_user_Click(object sender, EventArgs e)        {            // 给记录文件中添加相应的用户            add_user_form = new Add_user();            add_user_form.Owner = this;            add_user_form.Show();            // 可见性改变的的时间发生以后,创建新的用户            add_user_form.VisibleChanged += new EventHandler(add_user_form_VisibleChanged);              }        /// <summary>        /// 添加用户,xml文件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        void add_user_form_VisibleChanged(object sender, EventArgs e)        {            string name = null;            string password = null;            // 获取创建用户的用户名和密码            name = add_user_form.name;            password = add_user_form.password;            // 获取值完全正确            //MessageBox.Show(name+":"+password,"info");            // 添加用户,使用xml文件配置用户信息            try            {                XmlDocument doc = new XmlDocument();                doc.Load(".//config//user_config//user.xml");                XmlNode root = doc.DocumentElement;                XmlElement newUser = doc.CreateElement("accout");                newUser.SetAttribute("name", name);                newUser.SetAttribute("password", password);                root.InsertAfter(newUser, root.LastChild);                doc.Save(".//config//user_config//user.xml");                this.richTextBox1.AppendText("添加用户成功" + '\n');                richTextBox1.AppendText("用户名:" + name);                richTextBox1.AppendText(" 密码:" + password + '\n');            }            catch (FileLoadException)            {                //            }            finally            {                //            }            // 创建用户以后,给用户创建相应的文件夹,存放上传的文件            createUserFolder();            //fs.Flush();            //fs.Close();        }        /// <summary>        /// 给用户创建文件夹        /// </summary>        private void createUserFolder()        {            string name = add_user_form.name;            // 创建和用户名一致的文件夹            string filePath = Environment.CurrentDirectory + "\\files";            string userPath = filePath + "\\" + name;            try            {                Directory.CreateDirectory(userPath);                // 创建文件夹以后在这个文件夹内创建用户的文件管理配置文件                XmlDocument doc = new XmlDocument();                XmlDeclaration xmld = doc.CreateXmlDeclaration("1.0", "GB2312", null);                XmlElement root = doc.CreateElement("user");                root.SetAttribute("name", name);                doc.AppendChild(xmld);                doc.AppendChild(root);                doc.Save(userPath + "\\" + "config.xml");            }            catch(FileLoadException)            {                //            }        }        private void Server_Form_Load(object sender, EventArgs e)        {            // todo        }    }}


 

 

本程序源码的下载连接: http://download.csdn.net/detail/weixingstudio/3882186

欢迎大家有好的建议都告诉我。

原创粉丝点击