1. 程式人生 > >採用C/S架構完成使用者註冊並連線Mysql資料庫(介面winform)

採用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)//顯示訊息
        {

        }
    }
}

介面效果: