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>(); } }}