/// <summary> /// 模拟TCP三次握手连接服务端 /// </summary> /// <returns></returns> public override void StartConnecting() { try { var now = TimeUitls.Now(); if (now - this.LastConnectTime < ANetChannel.ReConnectInterval) { return; } this.LastConnectTime = now; if (Connected) { return; } ConnectSender.SendSYN(this.NetSocket, this.RemoteEndPoint); } catch (Exception e) { #if DEBUG LogRecord.Log(LogLevel.Warn, "StartConnecting", e); #endif } }
/// <summary> /// 处理数据发送回调函数 /// </summary> protected void HandleSend() { try { while (!this.sendQueue.IsEmpty) { if (this.sendQueue.TryPeek(out SendTask send)) { if (send.Channel.Connected) { this.sendQueue.TryDequeue(out SendTask sendTask); sendTask.Channel.TimeNow = TimeUitls.Now(); sendTask.WriteToBuffer(); this.senders.Add(sendTask.Channel); } } } foreach (var channel in this.senders) { channel.StartSend(); } this.senders.Clear(); this.CheckHeadbeat(); } catch (Exception e) { #if DEBUG LogRecord.Log(LogLevel.Warn, "HandleSend", e); #endif } }
/// <summary> /// 心跳检测 /// </summary> private void CheckHeadbeat() { var now = TimeUitls.Now(); var lastCheckSpan = now - this.LastCheckTime; if (lastCheckSpan < HeartbeatTime) { return; } if (this.serviceType == NetServiceType.Client) { if (this.ClientChannel == null) { return; } if (!this.ClientChannel.Connected) { return; } var timeSpan = now - this.ClientChannel.LastSendTime; if (timeSpan > HeartbeatTime) { this.Session.SendMessage(new Packet { IsHeartbeat = true }); #if DEBUG LogRecord.Log(LogLevel.Info, "CheckHeadbeat", $"发送心跳包到服务端:{this.ClientChannel.RemoteEndPoint}."); #endif } } else if (this.serviceType == NetServiceType.Server) { var channels = this.Channels.Values; foreach (var channel in channels) { var timeSpan = now - channel.LastRecvTime; if (timeSpan > HeartbeatTime) { #if DEBUG LogRecord.Log(LogLevel.Info, "CheckHeadbeat", $"客户端:{channel.RemoteEndPoint}连接超时,心跳检测断开,心跳时长{timeSpan}."); #endif channel.DisConnect(); } } } LastCheckTime = now; }
/// <summary> /// KCP发送回调函数 /// </summary> /// <param name="bytes"></param> /// <param name="count"></param> /// <param name="user"></param> private void Output(byte[] bytes, int count, object user) { try { this.NetSocket.SendTo(bytes, 0, count, SocketFlags.None, this.RemoteEndPoint); this.LastSendTime = TimeUitls.Now(); } catch (Exception e) { DisConnect(); #if DEBUG LogRecord.Log(LogLevel.Warn, "Output", e); #endif } }
/// <summary> /// 开始连接 /// </summary> /// <returns></returns> public override void StartConnecting() { try { var now = TimeUitls.Now(); if (now - this.LastConnectTime < ANetChannel.ReConnectInterval) { return; } this.LastConnectTime = now; if (Connected) { return; } if (this.NetSocket == null) { this.NetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); this.NetSocket.NoDelay = true; this.inArgs = new SocketAsyncEventArgs(); this.outArgs = new SocketAsyncEventArgs(); this.inArgs.Completed += OnComplete; this.outArgs.Completed += OnComplete; } this.outArgs.RemoteEndPoint = this.RemoteEndPoint; if (this.NetSocket.ConnectAsync(this.outArgs)) { return; } OnConnectComplete(this.outArgs); } catch (Exception e) { #if DEBUG LogRecord.Log(LogLevel.Warn, "StartConnecting", e); #endif } }
private void OnConnectComplete(object o) { if (this.NetSocket == null) { return; } SocketAsyncEventArgs e = (SocketAsyncEventArgs)o; if (e.SocketError != SocketError.Success) { this.OnError?.Invoke(this, SocketError.SocketError); return; } this.LastConnectTime = TimeUitls.Now(); e.RemoteEndPoint = null; OnConnect?.Invoke(this); this.Connected = true; //this.StartRecv(); //this.StartSend(); }
/// <summary> /// 该方法并没有用 /// </summary> public override void StartRecv() { this.LastRecvTime = TimeUitls.Now(); SetKcpSendTime(); while (true) { int n = kcp.PeekSize(); if (n == 0) { //LogRecord.Log(LogLevel.Error, "StartRecv", $"解包失败:{this.RemoteEndPoint}"); return; } int count = this.kcp.Recv(cacheBytes, 0, cacheBytes.Length); if (count <= 0) { return; } RecvParser.WriteBuffer(cacheBytes, 0, count); while (true) { try { var packet = RecvParser.ReadBuffer(); if (!packet.IsSuccess) { break; } if (!packet.IsHeartbeat) { //LogRecord.Log(LogLevel.Error, "StartRecv", $"收到远程电脑:{this.RemoteEndPoint}"); if (packet.IsRpc) { if (RpcDictionarys.TryRemove(packet.RpcId, out Action <Packet> action)) { //执行RPC请求回调 action(packet); } else { OnReceive?.Invoke(packet); } } else { OnReceive?.Invoke(packet); } } else { #if DEBUG LogRecord.Log(LogLevel.Warn, "HandleRecv", $"接收到客户端:{this.RemoteEndPoint}心跳包."); #endif } } catch (Exception e) { DisConnect(); #if DEBUG LogRecord.Log(LogLevel.Warn, "StartRecv", e); #endif return; } } } }
private void OnRecvComplete(object o) { isReceiving = false; if (this.NetSocket == null) { return; } this.LastRecvTime = TimeUitls.Now(); SocketAsyncEventArgs e = (SocketAsyncEventArgs)o; if (e.SocketError != SocketError.Success) { DisConnect(); return; } if (e.BytesTransferred == 0) { DisConnect(); return; } RecvParser.Buffer.UpdateWrite(e.BytesTransferred); while (true) { try { var packet = RecvParser.ReadBuffer(); if (!packet.IsSuccess) { break; } LastRecvTime = TimeUitls.Now(); if (!packet.IsHeartbeat) { if (packet.IsRpc) { if (RpcDictionarys.TryRemove(packet.RpcId, out Action <Packet> action)) { //执行RPC请求回调 action(packet); } else { OnReceive?.Invoke(packet); } } else { OnReceive?.Invoke(packet); } } } catch (Exception ex) { DisConnect(); #if DEBUG LogRecord.Log(LogLevel.Warn, "OnRecvComplete", ex); #endif return; } } this.StartRecv(); }