From 2659a11858d89df5a8b9423739f1fb0158298ad0 Mon Sep 17 00:00:00 2001 From: sin365 <353374337@qq.com> Date: Thu, 29 Jun 2023 19:42:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0.net=204=20FX=E7=9A=84?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...9a169cf9-c88b-4c4f-9a0c-d45d55ad2258.vsidx | Bin 0 -> 56599 bytes ...cf83e350-4bc5-43f9-81eb-59edbfc5fbf9.vsidx | Bin 0 -> 56059 bytes ...e3af48d8-e269-446b-aa11-905c4c1dfd10.vsidx | Bin 0 -> 54005 bytes .../NetworkHelperCore.cs | 38 +- .../NetworkHelperP2PCore.cs | 372 ++++++++++++++++++ 5 files changed, 399 insertions(+), 11 deletions(-) create mode 100644 .vs/HaoYueNet/FileContentIndex/9a169cf9-c88b-4c4f-9a0c-d45d55ad2258.vsidx create mode 100644 .vs/HaoYueNet/FileContentIndex/cf83e350-4bc5-43f9-81eb-59edbfc5fbf9.vsidx create mode 100644 .vs/HaoYueNet/FileContentIndex/e3af48d8-e269-446b-aa11-905c4c1dfd10.vsidx create mode 100644 NetLib/HaoYueNet.ClientNetworkNet4x/NetworkHelperP2PCore.cs diff --git a/.vs/HaoYueNet/FileContentIndex/9a169cf9-c88b-4c4f-9a0c-d45d55ad2258.vsidx b/.vs/HaoYueNet/FileContentIndex/9a169cf9-c88b-4c4f-9a0c-d45d55ad2258.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..88f8863b6b98bd92b999194b4578e84f90e0fc92 GIT binary patch literal 56599 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 z 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∋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初始化网络核心"); @@ -48,22 +49,32 @@ namespace HaoYueNet.ClientNetworkNet4x SendIndex = MaxSendIndexNum; client = new Socket(SocketType.Stream, ProtocolType.Tcp); - //IPAddress ip = IPAddress.Parse(IP); - //IPEndPoint point = new IPEndPoint(ip, port); - - LogOut("连接到IP "+ IP + ":"+ port); + if (bBindReuseAddress) + { + client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + IPEndPoint ipe = new IPEndPoint(IPAddress.Any, Convert.ToInt32(bBindport)); + client.Bind(ipe); + } + Connect(IP, port); + } + public bool Connect(string IP, int port) + { //带回调的 - //client.BeginConnect(ip, port, new AsyncCallback(CallBackMethod) , client); try { + LogOut("连接到远程IP " + IP + ":" + port); client.Connect(IP, port); Thread thread = new Thread(Recive); thread.IsBackground = true; thread.Start(client); - LogOut("连接成功!"); + int localport = ((IPEndPoint)client.LocalEndPoint).Port; + LogOut($"连接成功!连接到远程IP->{IP}:{port} | 本地端口->{localport}"); - _heartTimer = new System.Timers.Timer(); + if (_heartTimer == null) + { + _heartTimer = new System.Timers.Timer(); + } _heartTimer.Interval = TimerInterval; _heartTimer.Elapsed += CheckUpdatetimer_Elapsed; _heartTimer.AutoReset = true; @@ -71,10 +82,13 @@ namespace HaoYueNet.ClientNetworkNet4x LogOut("开启心跳包检测"); OnConnected(true); + return true; } - catch + catch (Exception ex) { + LogOut("连接失败:" + ex.ToString()); OnConnected(false); + return false; } } @@ -96,7 +110,7 @@ namespace HaoYueNet.ClientNetworkNet4x OnCloseReady(); return; } - LogOut("发送消息,消息长度=> "+data.Length); + //LogOut("发送消息,消息长度=> "+data.Length); } private void SendHeartbeat() @@ -153,7 +167,7 @@ namespace HaoYueNet.ClientNetworkNet4x /// 序列化之后的数据 public void SendToServer(int CMDID,byte[] data) { - LogOut("准备数据 CMDID=> "+CMDID); + //LogOut("准备数据 CMDID=> "+CMDID); HunterNet_C2S _c2sdata = new HunterNet_C2S(); _c2sdata.HunterNetCoreCmdID = CMDID; _c2sdata.HunterNetCoreData = ByteString.CopyFrom(data); @@ -205,6 +219,7 @@ namespace HaoYueNet.ClientNetworkNet4x { LogOut("关闭心跳包计数"); _heartTimer.Enabled = false; + _heartTimer.Elapsed -= CheckUpdatetimer_Elapsed; LogOut("关闭连接"); //关闭Socket连接 client.Close(); @@ -346,6 +361,7 @@ namespace HaoYueNet.ClientNetworkNet4x //Console.WriteLine(Msg); OnLogOut(Msg); } + public Socket GetClientSocket() { return client; diff --git a/NetLib/HaoYueNet.ClientNetworkNet4x/NetworkHelperP2PCore.cs b/NetLib/HaoYueNet.ClientNetworkNet4x/NetworkHelperP2PCore.cs new file mode 100644 index 0000000..f7bfe13 --- /dev/null +++ b/NetLib/HaoYueNet.ClientNetworkNet4x/NetworkHelperP2PCore.cs @@ -0,0 +1,372 @@ +using Google.Protobuf; +using HunterProtobufCore; +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +namespace HaoYueNet.ClientNetworkNet4x +{ + public class NetworkHelperP2PCore + { + private Socket client; + + /// + /// 心跳包数据 + /// + private byte[] HeartbeatData = new byte[5] { 0x05, 0x00, 0x00, 0x00, 0x00 }; + + ////响应倒计时计数最大值 + //private static int MaxRevIndexNum = 6; + + ////发送倒计时计数最大值 + //private static int MaxSendIndexNum = 3; + + //响应倒计时计数最大值 + private static int MaxRevIndexNum = 50; + + //发送倒计时计数最大值 + private static int MaxSendIndexNum = 3; + + //响应倒计时计数 + private static int RevIndex=0; + //发送倒计时计数 + private static int SendIndex=0; + + //计时器间隔 + private static int TimerInterval = 3000; + + private System.Timers.Timer _heartTimer; + + public void Init(string IP, int port, bool bBindReuseAddress = false,int bBindport = 0) + { + + LogOut("==>初始化网络核心"); + + RevIndex = MaxRevIndexNum; + SendIndex = MaxSendIndexNum; + + client = new Socket(SocketType.Stream, ProtocolType.Tcp); + if (bBindReuseAddress) + { + client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + IPEndPoint ipe = new IPEndPoint(IPAddress.Any, Convert.ToInt32(bBindport)); + client.Bind(ipe); + } + Connect(IP, port); + } + + public bool Connect(string IP, int port) + { + //带回调的 + try + { + LogOut("连接到远程IP " + IP + ":" + port); + client.Connect(IP, port); + Thread thread = new Thread(Recive); + thread.IsBackground = true; + thread.Start(client); + int localport = ((IPEndPoint)client.LocalEndPoint).Port; + LogOut($"连接成功!连接到远程IP->{IP}:{port} | 本地端口->{localport}"); + + if (_heartTimer == null) + { + _heartTimer = new System.Timers.Timer(); + } + _heartTimer.Interval = TimerInterval; + _heartTimer.Elapsed += CheckUpdatetimer_Elapsed; + _heartTimer.AutoReset = true; + _heartTimer.Enabled = true; + LogOut("开启心跳包检测"); + + OnConnected(true); + return true; + } + catch (Exception ex) + { + LogOut("连接失败:" + ex.ToString()); + OnConnected(false); + return false; + } + } + + ~NetworkHelperP2PCore() + { + client.Close(); + } + + private void SendToSocket(byte[] data) + { + data = SendDataWithHead(data); + try + { + SendWithIndex(data); + } + catch (Exception ex) + { + //连接断开 + OnCloseReady(); + return; + } + //LogOut("发送消息,消息长度=> "+data.Length); + } + + private void SendHeartbeat() + { + try + { + SendWithIndex(HeartbeatData); + } + catch (Exception ex) + { + //连接断开 + OnCloseReady(); + return; + } + //LogOut("发送心跳包"); + } + + /// + /// 发送数据并计数 + /// + /// + private void SendWithIndex(byte[] data) + { + //增加发送计数 + SendIndex = MaxSendIndexNum; + //发送数据 + client.Send(data); + } + + //拼接头长度 + private byte[] SendDataWithHead(byte[] message) + { + + MemoryStream memoryStream = new MemoryStream();//创建一个内存流 + + byte[] BagHead = BitConverter.GetBytes(message.Length + 4);//往字节数组中写入包头(包头自身的长度和消息体的长度)的长度 + + memoryStream.Write(BagHead, 0, BagHead.Length);//将包头写入内存流 + + memoryStream.Write(message, 0, message.Length);//将消息体写入内存流 + + byte[] HeadAndBody = memoryStream.ToArray();//将内存流中的数据写入字节数组 + + memoryStream.Close();//关闭内存 + memoryStream.Dispose();//释放资源 + + return HeadAndBody; + } + + /// + /// 供外部调用 发送消息 + /// + /// + /// + /// + public void SendToSocket(int CMDID, int ERRCODE, byte[] data) + { + //LogOut("准备数据 CMDID=> "+CMDID); + HunterNet_S2C _s2sdata = new HunterNet_S2C(); + _s2sdata.HunterNetCoreCmdID = CMDID; + _s2sdata.HunterNetCoreERRORCode = ERRCODE; + _s2sdata.HunterNetCoreData = ByteString.CopyFrom(data); + byte[] _finaldata = Serizlize(_s2sdata); + SendToSocket(_finaldata); + } + + public delegate void OnDataCallBack_Data(int CMDID, int ERRCODE, byte[] data); + + public event OnDataCallBack_Data OnDataCallBack; + + public delegate void delegate_NoData(); + + public delegate void delegate_Bool(bool IsConnected); + + public event delegate_NoData OnClose; + + public event delegate_Bool OnConnected; + + public delegate void delegate_str(string Msg); + + /// + /// 网络库调试日志输出 + /// + public event delegate_str OnLogOut; + + ///// + ///// 用于调用者回调的虚函数 + ///// + ///// + //public virtual void DataCallBack(int CMDID,int ERRCODE,byte[] data) + //{ + + //} + + ///// + ///// 断开连接 + ///// + ///// + //public virtual void OnClose() + //{ + + //} + + /// + /// 做好处理的连接管理 + /// + private void OnCloseReady() + { + LogOut("关闭心跳包计数"); + _heartTimer.Enabled = false; + _heartTimer.Elapsed -= CheckUpdatetimer_Elapsed; + LogOut("关闭连接"); + //关闭Socket连接 + client.Close(); + OnClose(); + } + + + /// + /// 主动关闭连接 + /// + public void CloseConntect() + { + OnCloseReady(); + } + + private void DataCallBackReady(byte[] data) + { + + //增加接收计数 + RevIndex = MaxRevIndexNum; + + //不处理心跳包 + if (data.Length == 1 && data[0] == 0x00) + { + //LogOut("收到心跳包"); + return; + } + + HunterNet_S2C _c2s = DeSerizlize(data); + + OnDataCallBack(_c2s.HunterNetCoreCmdID, _c2s.HunterNetCoreERRORCode, _c2s.HunterNetCoreData.ToArray()); + } + + private void Recive(object o) + { + var client = o as Socket; + MemoryStream memoryStream = new MemoryStream();//开辟一个内存流 + + while (true) + { + byte[] buffer = new byte[1024 * 1024 * 2]; + int effective=0; + try + { + effective = client.Receive(buffer); + if (effective == 0) + { + continue; + } + } + catch(Exception ex) + { + //远程主机强迫关闭了一个现有的连接 + OnCloseReady(); + return; + //断开连接 + } + + + memoryStream.Write(buffer, 0, effective);//将接受到的数据写入内存流中 + byte[] getData = memoryStream.ToArray();//将内存流中的消息体写入字节数组 + int StartIndex = 0;//设置一个读取数据的起始下标 + + while (true) + { + + + if (effective > 0)//如果接受到的消息不为0(不为空) + { + int HeadLength = 0;//包头长度(包头+包体) + if (getData.Length - StartIndex < 4)//包头接受不完整 + { + HeadLength = -1; + } + else + { + //如果包头接受完整 转换成int类型的数值 + HeadLength = BitConverter.ToInt32(getData, StartIndex); + } + //包头接受完整但是消息体不完整 //包头接受不完整 + //↓↓↓↓↓↓↓↓ ↓↓↓ + if (getData.Length - StartIndex < HeadLength || HeadLength == -1) + { + memoryStream.Close();//关闭内存流 + memoryStream.Dispose();//释放内存资源 + memoryStream = new MemoryStream();//创建新的内存流 + memoryStream.Write(getData, StartIndex, getData.Length - StartIndex);//从新将接受的消息写入内存流 + break; + } + else + { + //把头去掉,就可以吃了,蛋白质是牛肉的六倍 + DataCallBackReady(getData.Skip(StartIndex+4).Take(HeadLength-4).ToArray()); + StartIndex += HeadLength;//当读取一条完整的数据后,读取数据的起始下标应为当前接受到的消息体的长度(当前数据的尾部或下一条消息的首部) + } + } + } + + } + } + + private void CheckUpdatetimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + //接收服务器数据计数 + RevIndex--; + if (RevIndex <= 0) + { + //判定掉线 + OnCloseReady(); + return; + } + + //发送计数 + SendIndex--; + if (SendIndex <= 0)//需要发送心跳包了 + { + //重置倒计时计数 + SendIndex = MaxSendIndexNum; + + SendHeartbeat(); + } + } + + public static byte[] Serizlize(IMessage msg) + { + return msg.ToByteArray(); + } + + public static T DeSerizlize(byte[] bytes) + { + var msgType = typeof(T); + object msg = Activator.CreateInstance(msgType); + ((IMessage)msg).MergeFrom(bytes); + return (T)msg; + } + + public void LogOut(string Msg) + { + //Console.WriteLine(Msg); + OnLogOut(Msg); + } + + public Socket GetClientSocket() + { + return client; + } + } +}