Server - Message.cs - 解析/拼合数据工具
class 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 ReadMessage(int newDataAmount, Action<RequestCode,ActionCode,string> processDataCallback ){}
//打包数据
public static byte[] PackData(动作码,数据){}
}
class 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 ReadMessage(int newDataAmount, Action<RequestCode,ActionCode,string> processDataCallback ){}
//打包数据
public static byte[] PackData(ActionCode actionCode,string data){}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common;
namespace GameServer.Servers
{
class Message
{
private byte[] data = new byte[1024];
private int startIndex = 0;//我们存取了多少个字节的数据在数组里面
//public void AddCount(int count)
//{
// startIndex += count;
//}
public byte[] Data
{
get { return data; }
}
public int StartIndex
{
get { return startIndex; }
}
public int RemainSize
{
get { return data.Length - startIndex; }
}
/// <summary>
/// 解析数据或者叫做读取数据
/// </summary>
public void ReadMessage(int newDataAmount, Action<RequestCode,ActionCode,string> processDataCallback )
{
startIndex += newDataAmount;
while (true)
{
if (startIndex <= 4) return;
int count = BitConverter.ToInt32(data, 0);
if ((startIndex - 4) >= count)
{
//解析信息
//Console.WriteLine(startIndex);
//Console.WriteLine(count);
//string s = Encoding.UTF8.GetString(data, 4, count);
//Console.WriteLine("解析出来一条数据:" + s);
RequestCode requestCode = (RequestCode)BitConverter.ToInt32(data, 4);//解析requestCode
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);
}
else
{
break;
}
}
}
//打包数据
public static byte[] PackData(ActionCode actionCode,string data)
{
byte[] requestCodeBytes = BitConverter.GetBytes((int)actionCode);
byte[] dataBytes = Encoding.UTF8.GetBytes(data);
int dataAmount = requestCodeBytes.Length + dataBytes.Length;
byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);
byte[] newBytes =dataAmountBytes.Concat(requestCodeBytes).ToArray<byte>();//Concat(dataBytes);
return newBytes.Concat(dataBytes).ToArray<byte>();
}
}
}