- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- //using System.Threading.Tasks;
- using Common;
- class Message
- {
- private byte[] data = new byte[1024]; //这个数组用来存取我们读取到的数据,让消息的长度最少能存的下1024 ,如果说最大的消息数组存不下的话 就没办法完整的读取这条消息了
- //如果消息不完整 我们不处理。我们会读取下一条
- private int startIndex = 0;//标识位,表示现在数据存储在什么位置了 ,如果没数据 sartIndex从0开始,如果存了10个之后 这个startIndex就等于10;
- //再来数据的话就从10开始存,同时也代表了存了多少个字节的数据。
- /// <summary>
- /// 这个数组用来存取我们读取到的数据
- /// </summary>
- public byte[] Data
- {
- get { return data; }
- }
- /// <summary>
- /// 代表存储了多少个字节的数据 开始索引
- /// </summary>
- public int StartIndex
- {
- get { return startIndex; }
- }
- /// <summary>
- /// 剩余的空间
- /// </summary>
- public int RemaniSize
- {
- get { return data.Length - startIndex; }
- }
- /// <summary>
- /// 更新了多少数据
- /// </summary>
- /// <param name="count"></param>
- //public void AddCount(int count)
- //{
- // startIndex += count;
- //}
- /// <summary>
- /// 解析数据或者叫做读取数据 newDataAmount数量
- /// </summary>
- public void ReadMessage(int newDataAmount, Action<RequesCode, ActionCode, string> processDataCallback)
- {
- startIndex += newDataAmount;
- while (true)
- {
- if (startIndex <= 4) return;
- int count = BitConverter.ToInt32(data, 0);//这个只占前四个字节 ,变成int 就是数据长度
- if ((startIndex - 4) >= count) //(startIndex-4)是剩余数据的长度 ,大于count 就说明数据是完整的
- {
- //string s = Encoding.UTF8.GetString(data, 4, count);
- //Console.WriteLine("解析出来一条数据 :" + s);
- RequesCode requestCode = (RequesCode)BitConverter.ToInt32(data, 4); ///解析出来的是ResourceCode
- ActionCode actionCode = (ActionCode)BitConverter.ToInt32(data, 8); ///解析出来的是ActionCode
- string s = Encoding.UTF8.GetString(data, 12, count - 8);
- processDataCallback(requestCode, actionCode, s);
- Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);
- startIndex -= (count + 4); //移动完了之后更新startIndex
- }
- else
- {
- break;
- }
- }
- }
- /// <summary>
- /// 用于包装
- /// </summary>
- /// <param name="requsetData"></param>
- /// <param name="data"></param>
- /// <returns></returns>
- public static byte[] PakeData(RequesCode requsetData,ActionCode actionCode, string data)
- {
- byte[] requsetCodeBytes = BitConverter.GetBytes((int)requsetData);
- byte[] actionCodeBytes = BitConverter.GetBytes((int)actionCode);
- byte[] dataBytes = Encoding.UTF8.GetBytes(data);
- int dataAmount = requsetCodeBytes.Length + dataBytes.Length+actionCodeBytes.Length;
- byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);
- return dataAmountBytes.Concat(requsetCodeBytes).ToArray<byte>().Concat(actionCodeBytes).ToArray<byte>().Concat(dataBytes).ToArray<byte>();
- }
- /// <summary>
- /// 用于包装
- /// </summary>
- /// <param name="requsetData"></param>
- /// <param name="data"></param>
- /// <returns></returns>
- public static byte[] PakeData(RequesCode requsetData, string data)
- {
- byte[] requsetCodeBytes = BitConverter.GetBytes((int)requsetData);
- byte[] dataBytes = Encoding.UTF8.GetBytes(data);
- int dataAmount = requsetCodeBytes.Length + dataBytes.Length;
- byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);
- return dataAmountBytes.Concat(requsetCodeBytes).Concat(dataBytes).ToArray();
- }
- }
使用socket&Tcp开发网络游戏代码
最新推荐文章于 2021-03-13 09:53:22 发布