语言: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)//显示消息
{
}
}
}