采用C/S架构完成用户注册并连接Mysql数据库(界面winform)

语言:C#
开发平台:VS2017

对于C/S架构的一些基本交互我前面已经写过了,这里就不再赘述,C#并没有直接连接数据库的东西,需要导入数据库的插件才能驱动数据库操作,using MySql.Data.MySqlClient;也就是引如这个命名空间,这个空间来自Mysql下的一个dll插件,需要自己导入,具体操作:在VS里面找到视图->解决方案资源管理器->引用->右击添加引用->然后找到目录下的dll插件MySql.Data.dll没有这个插件的可以去mysql官网下载,下载好之后放入位置根据系统决定,32位系统放在C:\Windows\System32,64位系统放在C:\Windows\SysWOW64目录下。
需要下载安装mysql可以参照这个博主:https://blog.csdn.net/liyuqian199695/article/details/53556639
写这个博客主要是供参考以及对于自己劳动的总结,有不正当地方欢迎指出。

基本功能:将客户端的一些注册信息发送到服务端显示,并存储在Mysql数据库中。服务端在线列表显示当前在线客户端,
详情见代码。
客户端代码:https://paste.ubuntu.com/p/YKyBphC4TD/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using MySql.Data.MySqlClient;
namespace Client_Form
{
    public partial class Form1 : Form
    {
        private byte[] result = new byte[1024 * 1024];
        private Socket ClientSocket = new Socket(AddressFamily.InterNetwork
            , SocketType.Stream, ProtocolType.Tcp);
        public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;
            richTextBox1.Multiline = true;     //将Multiline属性设置为true,实现显示多行
            richTextBox1.ScrollBars = RichTextBoxScrollBars.Vertical; //设置ScrollBars 属性只显示垂直滚动条
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void textBox1_TextChanged(object sender, EventArgs e)//IP
        {

        }
        private void textBox2_TextChanged(object sender, EventArgs e)//Port
        {

        }
        private void button1_Click(object sender, EventArgs e)//连接服务器
        {
            int Port = Convert.ToInt32(textBox2.Text);
            IPAddress IP = IPAddress.Parse((string)textBox1.Text);
            try
            {
                ClientSocket.Connect(new IPEndPoint(IP, Port));
                richTextBox1.Text += "连接服务器成功!\r\n";
                Thread thread = new Thread(ReceiveMessage);
                thread.IsBackground = true;
                thread.Start();
            }
            catch(Exception ex)
            {
                richTextBox1.Text += "连接服务器失败!\r\n";
                return;
            }
        }
        public void ReceiveMessage()
        {
            while(true)
            {
                try
                {
                    int ReceiveLength = ClientSocket.Receive(result);
                    richTextBox1.Text += "接收服务器消息:";
                    string str = Encoding.UTF8.GetString(result, 0, ReceiveLength);
                    richTextBox1.Text += str+"\r\n";
                }
                catch(Exception ex)
                {
                    richTextBox1.Text += "接收消息失败!\r\n"+ex.Message;
                    ClientSocket.Shutdown(SocketShutdown.Both);
                    ClientSocket.Close();
                    break;
                }
            }
        }
        private void richTextBox1_TextChanged(object sender, EventArgs e)//显示是否连接成功
        {

        }
        public void SendMessage1()
        {
            string str1 = textBox4.Text;
            byte[] result1 = Encoding.UTF8.GetBytes(str1);
            byte[] result2 = new byte[result1.Length + 1];
            result2[0] = 1;
            Buffer.BlockCopy(result1, 0, result2, 1, result1.Length);
            ClientSocket.Send(result2);
            Thread thread2 = new Thread(SendMessage2);
            thread2.IsBackground = true;
            Thread.Sleep(3000);
            thread2.Start();
        }
        public void SendMessage2()
        {
            string str1 = textBox5.Text;
            byte[] result1 = Encoding.UTF8.GetBytes(str1);
            byte[] result2 = new byte[result1.Length + 1];
            result2[0] = 2;
            Buffer.BlockCopy(result1, 0, result2, 1, result1.Length);
            ClientSocket.Send(result2);
            Thread thread3 = new Thread(SendMessage3);
            thread3.IsBackground = true;
            Thread.Sleep(3000);
            thread3.Start();
        }
        public void SendMessage3()
        {
            string str1 = textBox6.Text;
            byte[] result1 = Encoding.UTF8.GetBytes(str1);
            byte[] result2 = new byte[result1.Length + 1];
            result2[0] = 3;
            Buffer.BlockCopy(result1, 0, result2, 1, result1.Length);
            ClientSocket.Send(result2);
            Thread thread4 = new Thread(SendMessage4);
            thread4.IsBackground = true;
            Thread.Sleep(3000);
            thread4.Start();
        }
        public void SendMessage4()
        {
            string str1 = textBox7.Text;
            byte[] result1 = Encoding.UTF8.GetBytes(str1);
            byte[] result2 = new byte[result1.Length + 1];
            result2[0] = 4;
            Buffer.BlockCopy(result1, 0, result2, 1, result1.Length);
            ClientSocket.Send(result2);
            MessageBox.Show("注册成功!");
            /*textBox3.Clear();
            textBox4.Clear();
            textBox5.Clear();
            textBox6.Clear();
            textBox7.Clear();*/
        }
        private void button2_Click(object sender, EventArgs e)//确认注册按钮
        {
            try
            {
                string str1 = textBox3.Text;
                string str2 = textBox4.Text;
                string str3 = textBox5.Text;
                string str4 = textBox6.Text;
                string str5 = textBox7.Text;
                /*
                 * 数据库操作可以写成单独一个类,通过实例化对象来进行操作,增加代码可读性和可操作性
                 * */
                string constr = "Server=127.0.0.1;Initial Catalog=root;Database=tonghua;User ID=root;Password=5120154230;SslMode=none";
                MySqlConnection mycon = new MySqlConnection(constr);
                mycon.Open();//打开连接
                string check = "select * from student where id='" + str4 + "'";
                MySqlDataAdapter da = new MySqlDataAdapter(check, mycon); //创建适配器
                DataSet ds = new DataSet(); //创建数据集
                da.Fill(ds, "student"); //填充数据集
                if (da.Fill(ds, "student") > 0) //判断同名
                {
                    MessageBox.Show("该学号已经注册!"); //输出信息
                    return;
                }
                if (str1 == "")
                {
                    MessageBox.Show("姓名不能为空!");
                    return;
                }
                else if (str2 == "")
                {
                    MessageBox.Show("班级不能为空!");
                    return;
                }
                else if (str3 == "")
                {
                    MessageBox.Show("密码不能为空!");
                     return;
                }
                else if (str4 == "")
                {
                    MessageBox.Show("学号不能为空!");
                    return;
                }
                else if (str5 == "")
                {
                    MessageBox.Show("年龄不能为空!");
                    return;
                }
                else if(Convert.ToInt32(str5)>100)
                {
                    MessageBox.Show("请输入小于100的年龄!");
                    return;
                }
                else if(str3.Length<=3||str3.Length>16)
                {
                    MessageBox.Show("密码长度为4-16位!");
                    return;
                }
                else
                {
                    byte[] result1 = Encoding.UTF8.GetBytes(str1);
                    byte[] result2 = new byte[result1.Length + 1];
                    //因为我将第一位作为标记位,所以当然相应后移一位
                    result2[0] = 0;
                    Buffer.BlockCopy(result1, 0, result2, 1, result1.Length);//将result1复制给result2
                    ClientSocket.Send(result2);
                    Thread thread1 = new Thread(SendMessage1);
                    Thread.Sleep(3000);//延时3秒
                    thread1.IsBackground = true;//设置后台线程
                    thread1.Start();//启动线程
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show("注册失败!");
                /*
                 * 第一个和第二个都是关闭套接字,只是有所区别
                 * 详细参见:https://www.cnblogs.com/kex1n/p/7146054.html
                 * */
                ClientSocket.Shutdown(SocketShutdown.Both);
                ClientSocket.Close();
            }
        }
        private void textBox3_TextChanged(object sender, EventArgs e)//姓名标记为0
        {
        }
        private void textBox4_TextChanged(object sender, EventArgs e)//班级标记为1
        {
        }
        private void textBox5_TextChanged(object sender, EventArgs e)//密码标记为2
        {
        }
        private void textBox6_TextChanged(object sender, EventArgs e)//学号标记为3
        {
        }
        private void textBox7_TextChanged(object sender, EventArgs e)//年龄标记为4
        {
        }
    }
}


服务端代码:https://paste.ubuntu.com/p/Nv8GXwSGZt/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using MySql.Data.MySqlClient;
namespace Sever_Form
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            richTextBox5.Multiline = true;     //将Multiline属性设置为true,实现显示多行
            richTextBox5.ScrollBars = RichTextBoxScrollBars.Vertical; //设置ScrollBars 属性只显示垂直滚动条
        }
        private byte[] result=new byte[1024*1024];
        private Socket SeverSocket = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)//在线列表
        {

        }

        private void richTextBox3_TextChanged(object sender, EventArgs e)//显示年龄
        {

        }

        private void richTextBox4_TextChanged(object sender, EventArgs e)//显示学号
        {

        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)//显示姓名0
        {

        }

        private void richTextBox2_TextChanged(object sender, EventArgs e)//显示班级1
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)//IP
        {

        }

        private void textBox2_TextChanged(object sender, EventArgs e)//Port
        {

        }

        private void button1_Click(object sender, EventArgs e)//启动服务
        {
            try
            {
                int  Port= Convert.ToInt32(textBox2.Text);
                IPAddress IP = IPAddress.Parse((string)textBox1.Text);
                SeverSocket.Bind(new IPEndPoint(IP, Port));
                SeverSocket.Listen(10);
                richTextBox5.Text += "启动监听成功!\r\n";
                Thread ThreadListen = new Thread(ListenConnection);
                ThreadListen.IsBackground = true;
                ThreadListen.Start();
            }
            catch(Exception ex)
            {
                richTextBox5.Text += "监听异常!!!\r\n";
                SeverSocket.Shutdown(SocketShutdown.Both);
                SeverSocket.Close();
            }
        }
        private void ListenConnection()
        {
            Socket ConnectionSocket = null;
            while(true)
            {
                try
                {
                    ConnectionSocket = SeverSocket.Accept();
                    string remotePoint = ConnectionSocket.RemoteEndPoint.ToString();
                    IPAddress ClientIP = (ConnectionSocket.RemoteEndPoint as IPEndPoint).Address;
                    int ClientPort = (ConnectionSocket.RemoteEndPoint as IPEndPoint).Port;
                    string SendMessage = "本地IP:" + ClientIP +
                        ",本地端口:" + ClientPort.ToString();
                    ConnectionSocket.Send(Encoding.UTF8.GetBytes(SendMessage));

                    richTextBox5.Text += "成功与客户端" + remotePoint + "建立连接\r\n";
                    listBox1.Items.Add(remotePoint);
                    // ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveMessage);
                    //Thread thread = new Thread(pts);
                    Thread thread = new Thread(ReceiveMessage);
                    thread.IsBackground = true;//设置后台线程,随着主线程结束而结束
                    thread.Start(ConnectionSocket);

                }
                catch (Exception ex)
                {
                    richTextBox5.Text += "监听异常!" + ex.Message+"\r\n";
                    break;
                }
            }
        }
        private void ReceiveMessage(Object SocketClient)///接收消息
        {
            string str1 = null;
            string str2 = null;
            string str3 = null;
            string str4 = null;
            string str5 = null;
            while (true)
            {
                Socket ReceiveSocket = (Socket)SocketClient;
                try
                {
                    int ReceiveLength = 0;
                    byte[] result = new byte[1024 * 1024 * 10];
                    ReceiveLength = ReceiveSocket.Receive(result);
                    if (result[0]==0)//姓名
                    {
                        string ReceiveMessage = Encoding.UTF8.GetString(result, 1, ReceiveLength - 1);
                        richTextBox1.Text += ReceiveMessage;
                        str1 = ReceiveMessage;
                    }
                    if (result[0] == 1)//班级
                    {
                        string ReceiveMessage = Encoding.UTF8.GetString(result, 1, ReceiveLength - 1);
                        richTextBox2.Text += ReceiveMessage;
                        str2 = ReceiveMessage;
                    }
                    if (result[0] == 3)//学号
                    {
                        string ReceiveMessage = Encoding.UTF8.GetString(result, 1, ReceiveLength - 1);
                        richTextBox4.Text += ReceiveMessage;
                        str3 = ReceiveMessage;
                    }
                    if (result[0] == 4)//年龄
                    {
                        string ReceiveMessage = Encoding.UTF8.GetString(result, 1, ReceiveLength - 1);
                        richTextBox3.Text += ReceiveMessage;
                        str4 = ReceiveMessage;
                    }
                    if (result[0] == 2)//密码
                    {
                        string ReceiveMessage = Encoding.UTF8.GetString(result, 1, ReceiveLength - 1);
                        //richTextBox5.Text += ReceiveMessage;
                        str5 = ReceiveMessage;
                    }
                    if(str1!=null&&str2!=null&&str3!=null&&str4!=null&&str5!=null)
                    {
                        string constr = "Server=127.0.0.1;Initial Catalog=root;Database=tonghua;User ID=root;Password=5120154230;SslMode=none";
                        /*
                         * Sever参数为数据库所在服务器,Initial Catalog参数为用户名
                         * Database为所要连接数据库名称,Password为所要连接数据库密码,sslmode参数是因为有的不支持ssl连接,
                         * 所以这里设置为none
                         * */
                        MySqlConnection mycon = new MySqlConnection(constr);//实例化连接
                        mycon.Open();//打开连接
                        string strsql = "insert into student(name,class,password,id,age) values ('" + str1 + "','" + str2 + "', '"+str5+ "','" + str3+ "','" + str4+ "')";
                        MySqlCommand cmd = new MySqlCommand(strsql, mycon); //创建执行
                        cmd.ExecuteNonQuery(); //执行SQL
                        mycon.Close();//关闭连接
                    }
                }
                catch(Exception ex)
                {
                    richTextBox5.Text += "客户端" + ReceiveSocket.RemoteEndPoint + "连接中断" + "\r\n" +
                    ex.Message + "\r\n" + ex.StackTrace + "\r\n";
                    listBox1.Items.Remove(ReceiveSocket.RemoteEndPoint.ToString());
                    ReceiveSocket.Shutdown(SocketShutdown.Both);
                    ReceiveSocket.Close();
                    break;
                }
            }
        }
        private void button2_Click(object sender, EventArgs e)//发送消息
        {

        }

        private void textBox3_TextChanged(object sender, EventArgs e)//输入发送消息
        {

        }

        private void richTextBox5_TextChanged(object sender, EventArgs e)//显示消息
        {

        }
    }
}

界面效果:


猜你喜欢

转载自blog.csdn.net/dl962454/article/details/80782397
今日推荐