From 4667b74393ed341d8a44923cfc706af9c44b5329 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Mon, 8 Jan 2024 16:19:09 +0800 Subject: [PATCH] byte func optimize --- NetLib/HaoYueNet.ClientNetwork/BaseData.cs | 204 ++++++++++++++--- .../NetworkHelperCore.cs | 46 ++-- .../NetworkHelperP2PCore.cs | 23 +- NetLib/HaoYueNet.ServerNetwork/BaseData.cs | 205 +++++++++++++++--- .../NetWork/MemoryStreamPool.cs | 41 ++++ .../NetWork/TcpSaeaServer.cs | 107 +++++++-- .../NetWork/TokenMsgPool.cs | 53 +++++ 7 files changed, 583 insertions(+), 96 deletions(-) create mode 100644 NetLib/HaoYueNet.ServerNetwork/NetWork/MemoryStreamPool.cs diff --git a/NetLib/HaoYueNet.ClientNetwork/BaseData.cs b/NetLib/HaoYueNet.ClientNetwork/BaseData.cs index bf2e832..af43dba 100644 --- a/NetLib/HaoYueNet.ClientNetwork/BaseData.cs +++ b/NetLib/HaoYueNet.ClientNetwork/BaseData.cs @@ -1,48 +1,202 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Net.Sockets; namespace HaoYueNet.ClientNetwork { public static class BaseData { + /// + /// 心跳包数据 + /// + public static byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; + + public static void writeInt(byte[] buf, int offset, int value) + { + buf[offset++] = (byte)(255 & value); + buf[offset++] = (byte)(255 & value >> 8); + buf[offset++] = (byte)(255 & value >> 16); + buf[offset++] = (byte)(255 & value >>> 24); + } + + public static void writeUInt16(byte[] buf, int offset, int value) + { + buf[offset++] = (byte)(255 & value); + buf[offset++] = (byte)(255 & value >> 8); + } + + public static class HunterNet_Heartbeat + { + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs) + { + myreadEventArgs.SetBuffer(HeartbeatData, 0, HeartbeatData.Length); + } + } + public static class HunterNet_S2C { - public static byte[] CreatePkgData(UInt16 CmdID, UInt16 Error, byte[] data) + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data) { - byte[] newdata = new byte[2 + 2 + data.Length]; - BitConverter.GetBytes(CmdID).CopyTo(newdata, 0); - BitConverter.GetBytes(Error).CopyTo(newdata, 2); - Array.Copy(data, 0, newdata, 4, data.Length); - return newdata; + myreadEventArgs.SetBuffer(CreatePkgData(CmdID, Error, AddonBytes_Data)); } - public static void AnalysisPkgData(byte[] srcdata,out UInt16 CmdID,out UInt16 Error,out byte[] data) + public static byte[] CreatePkgData(UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data) { - data = new byte[srcdata.Length - 2 - 2]; - CmdID = BitConverter.ToUInt16(srcdata, 0); - Error = BitConverter.ToUInt16(srcdata, 2); - Array.Copy(srcdata, 4, data, 0, data.Length); + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //byte[] AddonBytes_Error = BitConverter.GetBytes(Error); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Error.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + ////包长度 + //AddonBytes_Lenght.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //AddonBytes_CmdID.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_CmdID.Length; + + ////Error + //AddonBytes_Error.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Error.Length; + + ////DATA + //AddonBytes_Data.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Data.Length; + //return BufferData; + + ////用Buffer.BlockCopy拷贝 + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //byte[] AddonBytes_Error = BitConverter.GetBytes(Error); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Error.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + ////包长度 + //Buffer.BlockCopy(AddonBytes_Lenght, 0, BufferData, LastIndex, AddonBytes_Lenght.Length); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //Buffer.BlockCopy(AddonBytes_CmdID, 0, BufferData, LastIndex, AddonBytes_CmdID.Length); + //LastIndex += AddonBytes_CmdID.Length; + + ////Error + //Buffer.BlockCopy(AddonBytes_Error, 0, BufferData, LastIndex, AddonBytes_Error.Length); + //LastIndex += AddonBytes_Error.Length; + + ////DATA + //Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, LastIndex, AddonBytes_Data.Length); + //LastIndex += AddonBytes_Data.Length; + + + + //用Buffer.BlockCopy拷贝 + //包长度 + int AllLenght = 4 + 2 + 2 + AddonBytes_Data.Length; + byte[] BufferData = new byte[AllLenght]; + + //包长度 + writeInt(BufferData, 0, AllLenght); + + //CMDID + writeUInt16(BufferData, 4, CmdID); + + //Error + writeUInt16(BufferData, 4 + 2, CmdID); + + //DATA + Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, 4 + 2 + 2, AddonBytes_Data.Length); + + return BufferData; + } + + public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out UInt16 Error, out byte[] data) + { + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Error = BitConverter.ToUInt16(srcdata, 2); + //data = new byte[srcdata.Length - 2 - 2]; + //Array.Copy(srcdata, 4, data, 0, data.Length); + + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Error = BitConverter.ToUInt16(srcdata, 2); + //Span span_srcdata = srcdata; + //data = span_srcdata.Slice(2 + 2).ToArray(); + + CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); + Error = BitConverter.ToUInt16(srcdata.Slice(2, 2)); + data = srcdata.Slice(2 + 2).ToArray(); } } public static class HunterNet_C2S { - public static byte[] CreatePkgData(UInt16 CmdID, byte[] data) + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, byte[] AddonBytes_Data) { - byte[] newdata = new byte[2 + data.Length]; - BitConverter.GetBytes(CmdID).CopyTo(newdata, 0); - Array.Copy(data, 0, newdata, 2, data.Length); - return newdata; + myreadEventArgs.SetBuffer(CreatePkgData(CmdID, AddonBytes_Data)); } - public static void AnalysisPkgData(byte[] srcdata, out UInt16 CmdID, out byte[] data) + public static byte[] CreatePkgData(UInt16 CmdID, byte[] AddonBytes_Data) { - data = new byte[srcdata.Length - 2]; - CmdID = BitConverter.ToUInt16(srcdata, 0); - Array.Copy(srcdata, 2, data, 0, data.Length); + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + + ////包长度 + //AddonBytes_Lenght.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //AddonBytes_CmdID.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_CmdID.Length; + + ////DATA + //AddonBytes_Data.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Data.Length; + + //myreadEventArgs.SetBuffer(BufferData, 0, BufferData.Length); + //return BufferData; + + //用Buffer.BlockCopy拷贝 + + byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Data.Length + 4; + int LastIndex = 0; + //包长度 + byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + byte[] BufferData = new byte[AllLenght]; + //包长度 + Buffer.BlockCopy(AddonBytes_Lenght, 0, BufferData, LastIndex, AddonBytes_Lenght.Length); + LastIndex += AddonBytes_Lenght.Length; + + //CMDID + Buffer.BlockCopy(AddonBytes_CmdID, 0, BufferData, LastIndex, AddonBytes_CmdID.Length); + LastIndex += AddonBytes_CmdID.Length; + + //DATA + Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, LastIndex, AddonBytes_Data.Length); + LastIndex += AddonBytes_Data.Length; + return BufferData; + } + + public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out byte[] data) + { + //data = new byte[srcdata.Length - 2]; + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Array.Copy(srcdata, 2, data, 0, data.Length); + + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Span span_srcdata = srcdata; + //data = span_srcdata.Slice(2).ToArray(); + + CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); + data = srcdata.Slice(2).ToArray(); } } } diff --git a/NetLib/HaoYueNet.ClientNetwork/NetworkHelperCore.cs b/NetLib/HaoYueNet.ClientNetwork/NetworkHelperCore.cs index 0d7a3b3..bc0c88e 100644 --- a/NetLib/HaoYueNet.ClientNetwork/NetworkHelperCore.cs +++ b/NetLib/HaoYueNet.ClientNetwork/NetworkHelperCore.cs @@ -9,10 +9,6 @@ namespace HaoYueNet.ClientNetwork { private Socket client; - /// - /// 心跳包数据 - /// - static byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; ////响应倒计时计数最大值 //private static int MaxRevIndexNum = 6; @@ -115,7 +111,8 @@ namespace HaoYueNet.ClientNetwork private void SendToSocket(byte[] data) { - data = SendDataWithHead(data); + //已拼接包长度,这里不再需要拼接长度 + //data = SendDataWithHead(data); try { SendWithIndex(data); @@ -156,25 +153,25 @@ namespace HaoYueNet.ClientNetwork client.Send(data); } - //拼接头长度 - private byte[] SendDataWithHead(byte[] message) - { + ////拼接头长度 + //private byte[] SendDataWithHead(byte[] message) + //{ - MemoryStream memoryStream = new MemoryStream();//创建一个内存流 + // MemoryStream memoryStream = new MemoryStream();//创建一个内存流 - byte[] BagHead = BitConverter.GetBytes(message.Length + 4);//往字节数组中写入包头(包头自身的长度和消息体的长度)的长度 + // byte[] BagHead = BitConverter.GetBytes(message.Length + 4);//往字节数组中写入包头(包头自身的长度和消息体的长度)的长度 - memoryStream.Write(BagHead, 0, BagHead.Length);//将包头写入内存流 + // memoryStream.Write(BagHead, 0, BagHead.Length);//将包头写入内存流 - memoryStream.Write(message, 0, message.Length);//将消息体写入内存流 + // memoryStream.Write(message, 0, message.Length);//将消息体写入内存流 - byte[] HeadAndBody = memoryStream.ToArray();//将内存流中的数据写入字节数组 + // byte[] HeadAndBody = memoryStream.ToArray();//将内存流中的数据写入字节数组 - memoryStream.Close();//关闭内存 - memoryStream.Dispose();//释放资源 + // memoryStream.Close();//关闭内存 + // memoryStream.Dispose();//释放资源 - return HeadAndBody; - } + // return HeadAndBody; + //} /// /// 供外部调用 发送消息 @@ -343,11 +340,18 @@ namespace HaoYueNet.ClientNetwork //把头去掉,就可以吃了,蛋白质是牛肉的六倍 //DataCallBackReady(getData.Skip(StartIndex+4).Take(HeadLength-4).ToArray()); - //改为Array.Copy 提升效率 int CoreLenght = HeadLength - 4; - byte[] retData = new byte[CoreLenght]; - Array.Copy(getData, StartIndex + 4, retData, 0, CoreLenght); - DataCallBackReady(retData); + + //改为Array.Copy 提升效率 + //byte[] retData = new byte[CoreLenght]; + //Array.Copy(getData, StartIndex + 4, retData, 0, CoreLenght); + //DataCallBackReady(retData); + + //用Span + Span getData_span = getData; + getData_span = getData_span.Slice(StartIndex + 4,CoreLenght); + DataCallBackReady(getData_span.ToArray()); + StartIndex += HeadLength;//当读取一条完整的数据后,读取数据的起始下标应为当前接受到的消息体的长度(当前数据的尾部或下一条消息的首部) } } diff --git a/NetLib/HaoYueNet.ClientNetwork/NetworkHelperP2PCore.cs b/NetLib/HaoYueNet.ClientNetwork/NetworkHelperP2PCore.cs index 60734f8..8a5984b 100644 --- a/NetLib/HaoYueNet.ClientNetwork/NetworkHelperP2PCore.cs +++ b/NetLib/HaoYueNet.ClientNetwork/NetworkHelperP2PCore.cs @@ -8,10 +8,6 @@ namespace HaoYueNet.ClientNetwork { private Socket client; - /// - /// 心跳包数据 - /// - private byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; ////响应倒计时计数最大值 //private static int MaxRevIndexNum = 6; @@ -94,7 +90,8 @@ namespace HaoYueNet.ClientNetwork private void SendToSocket(byte[] data) { - data = SendDataWithHead(data); + //已拼接包长度,这里不再需要拼接长度 + //data = SendDataWithHead(data); try { SendWithIndex(data); @@ -112,7 +109,7 @@ namespace HaoYueNet.ClientNetwork { try { - SendWithIndex(HeartbeatData); + SendWithIndex(BaseData.HeartbeatData); } catch (Exception ex) { @@ -324,11 +321,17 @@ namespace HaoYueNet.ClientNetwork //把头去掉,就可以吃了,蛋白质是牛肉的六倍 //DataCallBackReady(getData.Skip(StartIndex+4).Take(HeadLength-4).ToArray()); - //改为Array.Copy 提升效率 int CoreLenght = HeadLength - 4; - byte[] retData = new byte[CoreLenght]; - Array.Copy(getData, StartIndex + 4, retData, 0, CoreLenght); - DataCallBackReady(retData); + //改为Array.Copy 提升效率 + //byte[] retData = new byte[CoreLenght]; + //Array.Copy(getData, StartIndex + 4, retData, 0, CoreLenght); + //DataCallBackReady(retData); + + //用Span + Span getData_span = getData; + getData_span = getData_span.Slice(StartIndex + 4, CoreLenght); + DataCallBackReady(getData_span.ToArray()); + StartIndex += HeadLength;//当读取一条完整的数据后,读取数据的起始下标应为当前接受到的消息体的长度(当前数据的尾部或下一条消息的首部) } } diff --git a/NetLib/HaoYueNet.ServerNetwork/BaseData.cs b/NetLib/HaoYueNet.ServerNetwork/BaseData.cs index a7149d8..643e534 100644 --- a/NetLib/HaoYueNet.ServerNetwork/BaseData.cs +++ b/NetLib/HaoYueNet.ServerNetwork/BaseData.cs @@ -1,48 +1,203 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Net.Sockets; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace HaoYueNet.ServerNetwork { public static class BaseData { + /// + /// 心跳包数据 + /// + public static byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; + + public static void writeInt(byte[] buf, int offset, int value) + { + buf[offset++] = (byte)(255 & value); + buf[offset++] = (byte)(255 & value >> 8); + buf[offset++] = (byte)(255 & value >> 16); + buf[offset++] = (byte)(255 & value >>> 24); + } + + public static void writeUInt16(byte[] buf, int offset, int value) + { + buf[offset++] = (byte)(255 & value); + buf[offset++] = (byte)(255 & value >> 8); + } + + public static class HunterNet_Heartbeat + { + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs) + { + myreadEventArgs.SetBuffer(HeartbeatData, 0, HeartbeatData.Length); + } + } + public static class HunterNet_S2C { - public static byte[] CreatePkgData(UInt16 CmdID, UInt16 Error, byte[] data) + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data) { - byte[] newdata = new byte[2 + 2 + data.Length]; - BitConverter.GetBytes(CmdID).CopyTo(newdata, 0); - BitConverter.GetBytes(Error).CopyTo(newdata, 2); - Array.Copy(data, 0, newdata, 4, data.Length); - return newdata; + myreadEventArgs.SetBuffer(CreatePkgData(CmdID, Error, AddonBytes_Data)); } - public static void AnalysisPkgData(byte[] srcdata, out UInt16 CmdID, out UInt16 Error, out byte[] data) + public static byte[] CreatePkgData(UInt16 CmdID, UInt16 Error, byte[] AddonBytes_Data) { - data = new byte[srcdata.Length - 2 - 2]; - CmdID = BitConverter.ToUInt16(srcdata, 0); - Error = BitConverter.ToUInt16(srcdata, 2); - Array.Copy(srcdata, 4, data, 0, data.Length); + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //byte[] AddonBytes_Error = BitConverter.GetBytes(Error); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Error.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + ////包长度 + //AddonBytes_Lenght.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //AddonBytes_CmdID.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_CmdID.Length; + + ////Error + //AddonBytes_Error.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Error.Length; + + ////DATA + //AddonBytes_Data.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Data.Length; + //return BufferData; + + ////用Buffer.BlockCopy拷贝 + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //byte[] AddonBytes_Error = BitConverter.GetBytes(Error); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Error.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + ////包长度 + //Buffer.BlockCopy(AddonBytes_Lenght, 0, BufferData, LastIndex, AddonBytes_Lenght.Length); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //Buffer.BlockCopy(AddonBytes_CmdID, 0, BufferData, LastIndex, AddonBytes_CmdID.Length); + //LastIndex += AddonBytes_CmdID.Length; + + ////Error + //Buffer.BlockCopy(AddonBytes_Error, 0, BufferData, LastIndex, AddonBytes_Error.Length); + //LastIndex += AddonBytes_Error.Length; + + ////DATA + //Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, LastIndex, AddonBytes_Data.Length); + //LastIndex += AddonBytes_Data.Length; + + + + //用Buffer.BlockCopy拷贝 + //包长度 + int AllLenght = 4 + 2 + 2 + AddonBytes_Data.Length; + byte[] BufferData = new byte[AllLenght]; + + //包长度 + writeInt(BufferData, 0, AllLenght); + + //CMDID + writeUInt16(BufferData, 4, CmdID); + + //Error + writeUInt16(BufferData, 4 + 2, CmdID); + + //DATA + Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, 4 + 2 + 2, AddonBytes_Data.Length); + + return BufferData; + } + + public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out UInt16 Error, out byte[] data) + { + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Error = BitConverter.ToUInt16(srcdata, 2); + //data = new byte[srcdata.Length - 2 - 2]; + //Array.Copy(srcdata, 4, data, 0, data.Length); + + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Error = BitConverter.ToUInt16(srcdata, 2); + //Span span_srcdata = srcdata; + //data = span_srcdata.Slice(2 + 2).ToArray(); + + CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); + Error = BitConverter.ToUInt16(srcdata.Slice(2, 2)); + data = srcdata.Slice(2 + 2).ToArray(); } } public static class HunterNet_C2S { - public static byte[] CreatePkgData(UInt16 CmdID, byte[] data) + public static void SetDataToSocketAsyncEventArgs(SocketAsyncEventArgs myreadEventArgs, UInt16 CmdID, byte[] AddonBytes_Data) { - byte[] newdata = new byte[2 + data.Length]; - BitConverter.GetBytes(CmdID).CopyTo(newdata, 0); - Array.Copy(data, 0, newdata, 2, data.Length); - return newdata; + myreadEventArgs.SetBuffer(CreatePkgData(CmdID, AddonBytes_Data)); } - public static void AnalysisPkgData(byte[] srcdata, out UInt16 CmdID, out byte[] data) + public static byte[] CreatePkgData(UInt16 CmdID, byte[] AddonBytes_Data) { - data = new byte[srcdata.Length - 2]; - CmdID = BitConverter.ToUInt16(srcdata, 0); - Array.Copy(srcdata, 2, data, 0, data.Length); + //byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + //int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Data.Length + 4; + //int LastIndex = 0; + ////包长度 + //byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + //byte[] BufferData = new byte[AllLenght]; + + ////包长度 + //AddonBytes_Lenght.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Lenght.Length; + + ////CMDID + //AddonBytes_CmdID.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_CmdID.Length; + + ////DATA + //AddonBytes_Data.CopyTo(BufferData, LastIndex); + //LastIndex += AddonBytes_Data.Length; + + //myreadEventArgs.SetBuffer(BufferData, 0, BufferData.Length); + //return BufferData; + + //用Buffer.BlockCopy拷贝 + + byte[] AddonBytes_CmdID = BitConverter.GetBytes(CmdID); + int AllLenght = AddonBytes_CmdID.Length + AddonBytes_Data.Length + 4; + int LastIndex = 0; + //包长度 + byte[] AddonBytes_Lenght = BitConverter.GetBytes(AllLenght); + + byte[] BufferData = new byte[AllLenght]; + //包长度 + Buffer.BlockCopy(AddonBytes_Lenght, 0, BufferData, LastIndex, AddonBytes_Lenght.Length); + LastIndex += AddonBytes_Lenght.Length; + + //CMDID + Buffer.BlockCopy(AddonBytes_CmdID, 0, BufferData, LastIndex, AddonBytes_CmdID.Length); + LastIndex += AddonBytes_CmdID.Length; + + //DATA + Buffer.BlockCopy(AddonBytes_Data, 0, BufferData, LastIndex, AddonBytes_Data.Length); + LastIndex += AddonBytes_Data.Length; + return BufferData; + } + + public static void AnalysisPkgData(Span srcdata, out UInt16 CmdID, out byte[] data) + { + //data = new byte[srcdata.Length - 2]; + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Array.Copy(srcdata, 2, data, 0, data.Length); + + //CmdID = BitConverter.ToUInt16(srcdata, 0); + //Span span_srcdata = srcdata; + //data = span_srcdata.Slice(2).ToArray(); + + CmdID = BitConverter.ToUInt16(srcdata.Slice(0, 2)); + data = srcdata.Slice(2).ToArray(); } } } diff --git a/NetLib/HaoYueNet.ServerNetwork/NetWork/MemoryStreamPool.cs b/NetLib/HaoYueNet.ServerNetwork/NetWork/MemoryStreamPool.cs new file mode 100644 index 0000000..ef01b0e --- /dev/null +++ b/NetLib/HaoYueNet.ServerNetwork/NetWork/MemoryStreamPool.cs @@ -0,0 +1,41 @@ +using System.Net.Sockets; + +namespace HaoYueNet.ServerNetwork +{ + + public class MemoryStreamPool + { + Stack m_pool; + + public MemoryStreamPool(int capacity) + { + m_pool = new Stack(capacity); + } + + public void Push(MemoryStream item) + { + if (item == null) { throw new ArgumentNullException("Items added to a MemoryStream cannot be null"); } + lock (m_pool) + { + m_pool.Push(item); + } + } + public MemoryStream Pop() + { + lock (m_pool) + { + return m_pool.Pop(); + } + } + + public int Count + { + get { return m_pool.Count; } + } + + public void Clear() + { + m_pool.Clear(); + } + } +} diff --git a/NetLib/HaoYueNet.ServerNetwork/NetWork/TcpSaeaServer.cs b/NetLib/HaoYueNet.ServerNetwork/NetWork/TcpSaeaServer.cs index f003a96..2c100d2 100644 --- a/NetLib/HaoYueNet.ServerNetwork/NetWork/TcpSaeaServer.cs +++ b/NetLib/HaoYueNet.ServerNetwork/NetWork/TcpSaeaServer.cs @@ -7,10 +7,6 @@ namespace HaoYueNet.ServerNetwork { public class TcpSaeaServer { - /// - /// 心跳包数据 - /// - static byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; //响应倒计时计数最大值 //public int MaxRevIndexNum { get; set; } = 5; ////发送倒计时计数最大值 @@ -523,7 +519,15 @@ namespace HaoYueNet.ServerNetwork { TokenWithMsg msg = msg_pool.Dequeue(); //OutNetLog("从信息池取出发送"); - SendMessage(msg.token, msg.message); + //是心跳包 + if (msg.bHeartbeat) + { + SendHeartbeatMessage(msg.token); + } + else + { + SendMessage(msg.token,msg.CMDID,msg.Error,msg.data); + } msg = null; } catch @@ -540,7 +544,7 @@ namespace HaoYueNet.ServerNetwork } } - + /* public void SendMessage(AsyncUserToken token, byte[] message,bool dontNeedHead = false) { if (token == null || token.Socket == null || !token.Socket.Connected) @@ -579,8 +583,80 @@ namespace HaoYueNet.ServerNetwork OutNetLog(e.ToString()); } } + */ - //拼接长度 + public void SendMessage(AsyncUserToken token,UInt16 CmdID, UInt16 Error, byte[] data) + { + if (token == null || token.Socket == null || !token.Socket.Connected) + return; + try + { + if (m_Sendpool.Count > 0) + { + SocketAsyncEventArgs myreadEventArgs = m_Sendpool.Pop(); + myreadEventArgs.UserToken = token; + myreadEventArgs.AcceptSocket = token.Socket; + //myreadEventArgs.SetBuffer(message, 0, message.Length); //将数据放置进去. + //更换为CMDID和Data直接写入SocketAsyncEventArgs的Buff + HunterNet_S2C.SetDataToSocketAsyncEventArgs(myreadEventArgs, CmdID, Error, data); + + //若不需要等待 + if (!token.Socket.SendAsync(myreadEventArgs)) + { + m_Sendpool.Push(myreadEventArgs); + } + return; + } + else + { + //先压入队列,等待m_Sendpool回收 + msg_pool.Enqueue(new TokenWithMsg() { token = token, CMDID = CmdID, Error = Error, data = data }); + //OutNetLog("!!!!压入消息发送队列MSG_Pool"); + return; + } + } + catch (Exception e) + { + OutNetLog(e.ToString()); + } + } + + public void SendHeartbeatMessage(AsyncUserToken token) + { + if (token == null || token.Socket == null || !token.Socket.Connected) + return; + try + { + if (m_Sendpool.Count > 0) + { + SocketAsyncEventArgs myreadEventArgs = m_Sendpool.Pop(); + myreadEventArgs.UserToken = token; + myreadEventArgs.AcceptSocket = token.Socket; + //直接写入SocketAsyncEventArgs的Buff + HunterNet_Heartbeat.SetDataToSocketAsyncEventArgs(myreadEventArgs); + + //若不需要等待 + if (!token.Socket.SendAsync(myreadEventArgs)) + { + m_Sendpool.Push(myreadEventArgs); + } + return; + } + else + { + //先压入队列,等待m_Sendpool回收 + msg_pool.Enqueue(new TokenWithMsg() { token = token, bHeartbeat = true }); + //OutNetLog("!!!!压入消息发送队列MSG_Pool"); + return; + } + } + catch (Exception e) + { + OutNetLog(e.ToString()); + } + } + + //拼接头部长度 private static byte[] SendDataWithHead(byte[] message) { @@ -589,7 +665,6 @@ namespace HaoYueNet.ServerNetwork byte[] BagHead = BitConverter.GetBytes(message.Length + 4);//往字节数组中写入包头(包头自身的长度和消息体的长度)的长度 memoryStream.Write(BagHead, 0, BagHead.Length);//将包头写入内存流 - memoryStream.Write(message, 0, message.Length);//将消息体写入内存流 byte[] HeadAndBody = memoryStream.ToArray();//将内存流中的数据写入字节数组 @@ -623,12 +698,12 @@ namespace HaoYueNet.ServerNetwork /// 发送数据并计数 /// /// - private void SendWithIndex(AsyncUserToken token, byte[] data) + private void SendWithIndex(AsyncUserToken token, UInt16 CmdID, UInt16 ERRCODE, byte[] data) { try { //发送数据 - SendMessage(token, data); + SendMessage(token, CmdID, ERRCODE, data); token.SendIndex = MaxSendIndexNum; } catch @@ -650,8 +725,10 @@ namespace HaoYueNet.ServerNetwork _s2cdata.HunterNetCoreData = ByteString.CopyFrom(data); _s2cdata.HunterNetCoreERRORCode = ERRCODE; byte[] _finaldata = Serizlize(_s2cdata);*/ - byte[] _finaldata = HunterNet_S2C.CreatePkgData((ushort)CMDID, (ushort)ERRCODE, data); - SendWithIndex(token, _finaldata); + + //byte[] _finaldata = HunterNet_S2C.CreatePkgData((ushort)CMDID, (ushort)ERRCODE, data); + + SendWithIndex(token, (ushort)CMDID, (ushort)ERRCODE, data); } private void DataCallBackReady(AsyncUserToken sk, byte[] data) @@ -697,7 +774,7 @@ namespace HaoYueNet.ServerNetwork /// /// /// - private void SendHeartbeat(AsyncUserToken token) + private void SendHeartbeatWithIndex(AsyncUserToken token) { if (token == null || token.Socket == null || !token.Socket.Connected) return; @@ -705,7 +782,7 @@ namespace HaoYueNet.ServerNetwork { //OutNetLog(DateTime.Now.ToString() + "发送心跳包"); token.SendIndex = MaxSendIndexNum; - SendMessage(token, HeartbeatData, true); + SendHeartbeatMessage(token); } catch (Exception e) { @@ -736,7 +813,7 @@ namespace HaoYueNet.ServerNetwork { //重置倒计时计数 m_clients[i].SendIndex = MaxSendIndexNum; - SendHeartbeat(m_clients[i]); + SendHeartbeatWithIndex(m_clients[i]); } } } diff --git a/NetLib/HaoYueNet.ServerNetwork/NetWork/TokenMsgPool.cs b/NetLib/HaoYueNet.ServerNetwork/NetWork/TokenMsgPool.cs index 5807533..9eac9c4 100644 --- a/NetLib/HaoYueNet.ServerNetwork/NetWork/TokenMsgPool.cs +++ b/NetLib/HaoYueNet.ServerNetwork/NetWork/TokenMsgPool.cs @@ -6,6 +6,58 @@ using System.Text; namespace HaoYueNet.ServerNetwork { + public class TokenWithMsg + { + public AsyncUserToken token; + public UInt16 CMDID; + public UInt16 Error; + public byte[] data; + public bool bHeartbeat; + } + + public class TokenMsgPool + { + //Stack msg_pool; + Queue msg_pool; + + public TokenMsgPool(int capacity) + { + msg_pool = new Queue(capacity); + } + + /// + /// 向 Queue 的末尾添加一个对象。 + /// + /// + public void Enqueue(TokenWithMsg item) + { + lock (msg_pool) + { + msg_pool.Enqueue(item); + } + } + + //移除并返回在 Queue 的开头的对象。 + public TokenWithMsg Dequeue() + { + lock (msg_pool) + { + return msg_pool.Dequeue(); + } + } + + public int Count + { + get { return msg_pool.Count; } + } + + public void Clear() + { + msg_pool.Clear(); + } + } + + /* public class TokenWithMsg { public AsyncUserToken token; @@ -74,4 +126,5 @@ namespace HaoYueNet.ServerNetwork msg_pool.Clear(); } } + */ }