博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
019-直接利用Socket/TCP开发网络游戏二
阅读量:6650 次
发布时间:2019-06-25

本文共 4570 字,大约阅读时间需要 15 分钟。

今天我们继续开始学习网络部分的知识。今天的部分是分为两个部分的一个数据传送,一个是MySQL的开头。废话不多说我们开始今天的内容。

我们其实知道在vs中是有粘包与分包的机制的,是为了内部的优化机制。那么我们应该如何去进行数据的传出与发送呢,我们用到的是这个类BitConverter.GetBytes这个类将所有的字符串都转换成四个字节,我们在tcp客户端创建一个类message,在其中写下如下的动心:

public class Message    {        public static byte[] GetBytes(string data)        {            //首先得到的是传来的字符串转换成字节数组            byte[] dataBytes = Encoding.UTF8.GetBytes(data);            //接着计算长度            int dataLength = data.Length;            //创建新数组            byte[] lengthByte = BitConverter.GetBytes(dataLength);//取到字节数组的长度            byte[] newBytes = lengthByte.Concat(dataBytes).ToArray();            return newBytes;        }    }

然后在在program中写

for (int i = 0; i < 100; i++)            {                clientSocket.Send(Message.GetBytes(i.ToString()));            }

接着在tcp服务器端写message,如下

private byte[] data = new byte[1024];        private int startIndex = 0;//开始索引        public byte[] Data { get { return data; } }        public int StartIndex { get { return startIndex; } }        //还剩余什么        public int RemainSize        {            get { return data.Length - startIndex; }        }        public void AddCount(int count)        {            startIndex += count;        }        //读数据        public void ReadMessage()        {            while (true)            {                //如果数据长度不足4的话,会返回                 if (startIndex <= 4) return;                //得到传来数据的长度,因为toint32一次只会解析前四个字节,这样就知道了数组中还有几个数据                int count = BitConverter.ToInt32(data, 0);                if ((startIndex - 4) >= count)                {                    //索引减4就是真正的数据长度,就接受数据                    string s = Encoding.UTF8.GetString(data, 4, count);                    Console.WriteLine("解析出来的数据为:" + s);                    //将数据进行更新                    Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);                    startIndex -= (count + 4);                }                else                {                    break;                }            }        }

在tcp的program中写下

static Message msg = new Message();
static void AcceptCallBack(IAsyncResult ar)        {            Socket serverSocket = ar.AsyncState as Socket;            Socket clientSocket = serverSocket.EndAccept(ar);            string msgStr = "Hello Client 您好...";            byte[] data = Encoding.UTF8.GetBytes(msgStr);            clientSocket.Send(data);            clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);            serverSocket.BeginAccept(AcceptCallBack, serverSocket);        }        static void ReceiveCallBack(IAsyncResult ar)        {            Socket clientSocket = null;            try            {                clientSocket = ar.AsyncState as Socket;                int count = clientSocket.EndReceive(ar);                if (count == 0)                {                    clientSocket.Close();                    return;                }                msg.AddCount(count);                msg.ReadMessage();                clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);            }            catch (Exception e)            {                Console.WriteLine(e);                if (clientSocket != null)                {                    clientSocket.Close();                }            }        }

这样就写了。

接下来是数据部分MySQL的使用就不说了,

//创建连接            string connStr = "database=text002;data source=localhost;port=3306;user Id=root;password=root;";            MySqlConnection conn = new MySqlConnection(connStr);            conn.Open();            #region 查询            //MySqlCommand cmd = new MySqlCommand("select *from user", conn);            //MySqlDataReader reader = cmd.ExecuteReader();            //while (reader.Read())            //{            //    string username = reader.GetString("username");            //    string password = reader.GetString("password");            //    Console.WriteLine(username + ":" + password);            //}            //reader.Close();            #endregion            #region 插入            //string username = "你好"; string password = "世界";            //MySqlCommand cmd = new MySqlCommand("insert into user set username=@un,password=@pwd", conn);            //cmd.Parameters.AddWithValue("un", username);            //cmd.Parameters.AddWithValue("pwd", password);                     //cmd.ExecuteNonQuery();            #endregion            conn.Close();//断开连接            Console.ReadKey();

就是这么多了。

转载于:https://www.cnblogs.com/jake-caiee/p/9879243.html

你可能感兴趣的文章
SDUT 3374 数据结构实验之查找二:平衡二叉树
查看>>
php的错误级别
查看>>
eclipse修改android项目的apk包名类名
查看>>
斐讯路扫地机器人怎么关机_扫地机器人使用方法,使用教程
查看>>
java 二元一次方程式_JAVA求解一元一次二次方程
查看>>
python与r语言处理excel数据_R语言第一章数据处理基础①读取EXEL表格数据
查看>>
上一家单位离职的原因_你从上一家公司辞职的原因是什么?几类标准答案
查看>>
ip扫描的原理是什么_什么是高防IP,高防IP的原理是什么样的
查看>>
import 快捷键 自动调整顺序_深入探讨 Python 的 import 机制:实现远程导入模块
查看>>
k型热电偶材料_设备篇——辊道窑之热电偶
查看>>
上车是什么意思_“上车饺子下车面”,是什么意思?看完心里暖暖的
查看>>
anaconda安装python3消失_Python学习第47课-安装Python以及anaconda介绍
查看>>
centos7中编译安装nodejs_Docker(一)CentOS7中安装Docker视频教程
查看>>
ug装配绕轴旋转_UG模具设计培训就到新科教育
查看>>
服务器闪退_马洛斯服务器|高端玩家游戏建议
查看>>
linux7 udev eth,CENTOS 7 udev:renamed network interface eth0 to eth1 eno16777736
查看>>
五子棋对弈程序c语言,五子棋程序纯C语言版.doc
查看>>
c语言二维数组程序实例讲解,C语言二维数组的处理实例
查看>>
c语言程序报告函数关系描述,《C语言程序设计》实验报告
查看>>
c语言while(scanf =eof),while(scanf("%d",&n)!=EOF)
查看>>