学习笔记 – Jtro的技术分享:游戏客户端通过Mysql留言给另一台游戏客户端

首先,需要编码前的准备,第一个就是下载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,到此结束了,在这过程中,出了许多问题,还好慢慢的解决了,编码真的是来不得半点粗心。
感谢各位。

正文完