首先,需要编码前的准备,第一个就是下载Mysql,配置好环境,安装Mysql的时候要记住自己设置的用户名和密码。然后下载本人提供的dll文件,下载连接放在评论区,再下载一个Navicat for MySql软件。
然后建立MySql数据库,步骤如下:
1.登录管理系统
测试数据库连接.PNG
在确定测试连接好了之后再点击确定,要不然没有用的。切记!
右击连接名,新建数据库,将数据库的名称命名为:msgboard
新建数据库.PNG
在msgboard中新建一个msg的表,里面包含ID、name、msg 3种数据,ID设置为自动递增的类型,然后手动的添加几条数据,如下图所示:
新建的表中数据.PNG
tips:保存表的时候如果跳出一个提示需要输入键长度,可将栏位符集属性设置为utf8,再将键长度设置为20.
然后修改Socket异步程序,使之成为留言板服务端程序
引用MySql.Data.dll,这个用到我在评论区放的连接中的文件了,添加这个引用就好。
1.在写入头文件:
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Data;
2.在Serv中添加指向MySql连接成员sqlConn
MySqlConnection sqlConn;
3.在Start方法中完成连接MySql和选择数据库2个步骤,还记得安装MySQL的密码吗?在这里需要用到的。
//数据库 留言板
string connStr = "Database=msgboard;Data Source=127.0.0.1;";
connStr += "User Id = zSql;Password = zhang826;port = 3306";//你设置的用户名和密码
sqlConn = new MySqlConnection(connStr );
try
{
sqlConn.Open();
}
catch (Exception e)
{
Console.WriteLine(" [ 数据库 ] 数据库连接失败");
return;
}
//数据库 留言板结束
4.修改ReceiveCb函数,处理留言板程序,核心代码实现的功能是:如果客户端发送的字符串是“_GET”,那么服务器将会查询数据库,并将最新的10条留言发送给客户端。如果客户端发送的是其他的字符串,那么服务器就把它插入数据库中,代码如下:
Conn conn = (Conn)ar.AsyncState;
try
{
int count = conn.socket.EndReceive(ar);
//关闭信号
//数据处理
string str = System.Text.Encoding.UTF8.GetString(conn.readBuff, 0, count);
Console.WriteLine("收到 [" + conn.GetAdress() + "] 数据:" + str);
HandleMsg(conn, str);
//继续接收
conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);
}
catch (Exception)
{
throw;
}
构造一个方法:
public void HandleMsg(Conn conn, string str)
{
if (str == "_GET")
{
string cmdStr = "select * from msg order by id desc limit 10;";
MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn);
try
{
MySqlDataReader dataReader = cmd.ExecuteReader();
str = "";
while (dataReader.Read())
{
str += dataReader["name"] + ":" + dataReader["msg"] + "\n\r";
}
dataReader.Close();
byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
conn.socket.Send(bytes);
}
catch (Exception e)
{
Console.WriteLine("[ 数据库查询失败 ]" + e.Message);
}
}
//插入数据
else
{
string cmdStrFormat = "insert into msg set name = '{0}',msg = '{1}';";
//有的版本不支持上述语法,改成这样:inset into msg ("name","msg")values ("{1}","{1}");以使之不报错
string cmdStr = string.Format(cmdStrFormat, conn.GetAdress(), str);
MySqlCommand cmd = new MySqlCommand(cmdStr, sqlConn);
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
Console.WriteLine("[ 数据库 ] 插入失败 " + e.Message);
}
}
}
运行服务器端:
服务器端.PNG
然后使用上一个版本的客户端,打开客户端连接服务器:
获取留言内容.PNG
OK,到此结束了,在这过程中,出了许多问题,还好慢慢的解决了,编码真的是来不得半点粗心。
感谢各位。