/// <summary> /// 断开连接 /// </summary> public override void DisConnect() { try { Connected = false; if (NetSocket == null) { return; } OnDisConnect?.Invoke(this); } catch { } try { SendParser.Clear(); RecvParser.Clear(); NetSocket.Close(); NetSocket.Dispose(); NetSocket = null; this.inArgs.Dispose(); this.outArgs.Dispose(); } catch { } }
public override void Close() { DisConnect(); rpcActions.Clear(); SendParser.Clear(); RecvParser.Clear(); OnClose?.Invoke(); OnClose = null; OnError = null; OnReceive = null; base.Close(); }
public override async Task StartRecv() { while (true) { if (!netStream.CanRead) { return; } try { var count = await netStream.ReadAsync(RecvParser.Buffer.Last, RecvParser.Buffer.LastOffset, RecvParser.Buffer.LastCount); if (count <= 0) { throw new SocketException((int)SocketError.SocketError); } RecvParser.Buffer.UpdateWrite(count); recvTime = DateTime.Now; while (true) { var packet = RecvParser.ReadBuffer(); if (!packet.IsSuccess) { break; } if (!packet.IsHeartbeat) { if (packet.IsRpc) { if (rpcActions.TryRemove(packet.RpcId, out Action <Packet> action)) { action(packet); } } else { OnReceive?.Invoke(packet); } } } } catch { OnError?.Invoke(this, SocketError.SocketError); } } }
/// <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(); }