/****************************** * 说明:Socket传输数据类 * 创建人:龚宇超 * 创建日期:2018-01-23 * 修改人: * 修改日期: * 修改备注: * 版本:1.0.0.0 ******************************/ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Lskj.SocketService { /// /// Socket传输数据类 /// public class DynamicBufferManager { /// ///存放内存的数组 /// /// The buffer. public byte[] Buffer { get; set; } /// /// 写入数据大小 /// /// The data count. public int DataCount { get; set; } public DynamicBufferManager(int bufferSize) { DataCount = 0; Buffer = new byte[bufferSize]; } /// /// 说明:获得当前写入的字节数 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// System.Int32. public int GetDataCount() { return DataCount; } /// /// 说明:获得剩余的字节数 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// System.Int32. public int GetReserveCount() { return Buffer.Length - DataCount; } /// /// 说明:清除数据 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// public void Clear() { DataCount = 0; } /// /// 说明:清理指定大小的数据 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The count. public void Clear(int count) { if (count >= DataCount) //如果需要清理的数据大于现有数据大小,则全部清理 { DataCount = 0; } else { for (int i = 0; i < DataCount - count; i++) //否则后面的数据往前移 { Buffer[i] = Buffer[count + i]; } DataCount = DataCount - count; } } /// /// 说明:设置缓存大小 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The size. public void SetBufferSize(int size) { if (Buffer.Length < size) { byte[] tmpBuffer = new byte[size]; Array.Copy(Buffer, 0, tmpBuffer, 0, DataCount); //复制以前的数据 Buffer = tmpBuffer; //替换 } } /// /// 说明:写入数据 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The buffer. /// The offset. /// The count. public void WriteBuffer(byte[] buffer, int offset, int count) { if (GetReserveCount() >= count) //缓冲区空间够,不需要申请 { Array.Copy(buffer, offset, Buffer, DataCount, count); DataCount = DataCount + count; } else //缓冲区空间不够,需要申请更大的内存,并进行移位 { int totalSize = Buffer.Length + count - GetReserveCount(); //总大小-空余大小 byte[] tmpBuffer = new byte[totalSize]; Array.Copy(Buffer, 0, tmpBuffer, 0, DataCount); //复制以前的数据 Array.Copy(buffer, offset, tmpBuffer, DataCount, count); //复制新写入的数据 DataCount = DataCount + count; Buffer = tmpBuffer; //替换 } } /// /// 说明:写入数据 /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The buffer. public void WriteBuffer(byte[] buffer) { WriteBuffer(buffer, 0, buffer.Length); } /// /// 说明:写入Short /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The value. /// if set to true [convert]. public void WriteShort(short value, bool convert) { if (convert) { value = System.Net.IPAddress.HostToNetworkOrder(value); //NET是小头结构,网络字节是大头结构,需要客户端和服务器约定好 } byte[] tmpBuffer = BitConverter.GetBytes(value); WriteBuffer(tmpBuffer); } /// /// 说明:写入Int /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The value. /// if set to true [convert]. public void WriteInt(int value, bool convert) { if (convert) { value = System.Net.IPAddress.HostToNetworkOrder(value); //NET是小头结构,网络字节是大头结构,需要客户端和服务器约定好 } byte[] tmpBuffer = BitConverter.GetBytes(value); WriteBuffer(tmpBuffer); } /// /// 说明:写入Long /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The value. /// if set to true [convert]. public void WriteLong(long value, bool convert) { if (convert) { value = System.Net.IPAddress.HostToNetworkOrder(value); //NET是小头结构,网络字节是大头结构,需要客户端和服务器约定好 } byte[] tmpBuffer = BitConverter.GetBytes(value); WriteBuffer(tmpBuffer); } /// /// 说明:写入String /// 创建人:龚宇超 /// 创建日期:2018-01-24 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// The value. public void WriteString(string value) //文本全部转成UTF8,UTF8兼容性好 { byte[] tmpBuffer = Encoding.UTF8.GetBytes(value); WriteBuffer(tmpBuffer); } } }