1、方法说明
服务器项目下新建类message,
/// <summary>
/// 用来存储和解析客户端发送过来的数据
/// </summary>
namespace TCP服务器端
{
class Message
{
private byte[] data = new byte[1024];//用来存储现在的数据,需要足够大
private int startIndex = 0;//当前data字节数组的大小
public void AddCount(int count)//AddCount用来每次将数据放入data数组后对startindex值进行更新
{
startIndex += count;
}
public byte[] Data
{
get { return data; }
}
public int StartIndex
{
get { return startIndex; }
}
public int RemainSize//data数组剩余的存储空间大小
{
get { return data.Length - startIndex; }
}
/// <summary>
///ReadMessage()方法逻辑思路如下:首先判断当前存取数据长度是否大于4字节,如果小于等于四字节则直接返回;
/// 然后获取data数组中的数据所存储的字节长度为多少,
/// 之后通过判断条件判断当前已存储数据长度减去四个字节(这四个字节用作了存储数据已使用长度信息)是否大于等于count值,
/// 即读取到的四字节长度信息,如果为true,则将data中从第四个字节开始长度为count的数据读取出来,这是一条信息数据;
/// 然后通过调用Array.copy()方法将data数组已读取完成的部分去掉,并将startindex值做出相应改变,
/// 如果之前的判断条件不成立则直接break掉,这个方法也就执行结束了。
/// </summary>
public void ReadMessage()//ReadMessage对每次传递过来的数据进行解析
{
while (true)
{
if (startIndex <= 4) return;//判断当前数据长度是否大于4字节;
int count = BitConverter.ToInt32(data, 0);// 当前数据字节长度,
if ((startIndex - 4) >= count)//当前已存储数据长度减去四个字节是否>=count值
{
Console.WriteLine(startIndex);
Console.WriteLine(count);
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;
}
}
}
}
}