採用C/S架構完成使用者註冊並連線Mysql資料庫(介面winform)
阿新 • • 發佈:2018-12-24
語言: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/
服務端程式碼: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.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)//顯示訊息 { } } }
介面效果: