采用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)//显示消息

        {

 

        }

    }

}

https://blog.csdn.net/dl962454/article/details/80782397

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值