public static void ListenTcp <T>(P2PTcpClient tcpClient) where T : ReceivePacket { RelationTcp_Server relationSt = new RelationTcp_Server(); relationSt.buffer = new byte[P2PGlobal.P2PSocketBufferSize]; relationSt.readTcp = tcpClient; relationSt.msgReceive = Activator.CreateInstance(typeof(T)) as ReceivePacket; relationSt.guid = EasyInject.Get <AppCenter>().CurrentGuid; relationSt.readTcp.GetStream().BeginRead(relationSt.buffer, 0, relationSt.buffer.Length, ReadTcp_Server, relationSt); }
public static void ListenTcp <T>(P2PTcpClient tcpClient) where T : ReceivePacket { RelationTcp_Server relationSt = new RelationTcp_Server(); relationSt.buffer = new byte[P2PGlobal.P2PSocketBufferSize]; relationSt.readTcp = tcpClient; relationSt.msgReceive = Activator.CreateInstance(typeof(T)) as ReceivePacket; relationSt.guid = EasyInject.Get <AppCenter>().CurrentGuid; relationSt.readTcp.GetStream().BeginRead(relationSt.buffer, 0, relationSt.buffer.Length, ReadTcp_Server, relationSt); //如果20秒仍未授权,则关闭 TimerUtils.Instance.AddJob(() => { if (!tcpClient.IsAuth) { EasyOp.Do(() => tcpClient?.SafeClose()); } }, 20000); }
private static void ReadTcp_Server(IAsyncResult ar) { RelationTcp_Server relation = (RelationTcp_Server)ar.AsyncState; if (relation.guid == EasyInject.Get <AppCenter>().CurrentGuid) { if (relation.readTcp.Connected && relation.readTcp.GetStream().CanRead) { int length = 0; EasyOp.Do(() => { length = relation.readTcp.GetStream().EndRead(ar); }, () => { if (length > 0) { byte[] refData = relation.buffer.Take(length).ToArray(); while (relation.msgReceive.ParseData(ref refData)) { // 执行command using (P2PCommand command = FindCommand(relation.readTcp, relation.msgReceive)) { //LogUtils.Trace($"命令类型:{relation.msgReceive.CommandType}"); if (command != null) { bool isSuccess = false; EasyOp.Do(() => { isSuccess = command.Excute(); }, e => { LogUtils.Error($"执行命令{relation.msgReceive.CommandType}时发生异常:{e}"); }); if (!isSuccess) { EasyOp.Do(() => { relation.readTcp?.SafeClose(); }); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); return; } } else { EasyOp.Do(() => { relation.readTcp?.SafeClose(); }); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); return; } } //重置msgReceive relation.msgReceive.Reset(); if (refData.Length <= 0) { break; } } if (relation.readTcp.Connected) { EasyOp.Do(() => { relation.readTcp.GetStream().BeginRead(relation.buffer, 0, relation.buffer.Length, ReadTcp_Server, relation); }, ex => { LogUtils.Debug($"Tcp连接已被断开 {relation.readTcp.RemoteEndPoint}"); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); }); } } else { EasyOp.Do(() => { relation.readTcp?.SafeClose(); }); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); } }, ex => { LogUtils.Debug($"Tcp连接已被断开 {relation.readTcp.RemoteEndPoint}"); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); }); } } else { LogUtils.Debug($"主动断开{relation.readTcp.RemoteEndPoint}连接"); EasyOp.Do(() => { relation.readTcp?.SafeClose(); }); EasyOp.Do(() => { relation.readTcp.ToClient?.SafeClose(); }); } //if (TcpCenter.Instance.ConnectedTcpList.Contains(relation.readTcp)) // TcpCenter.Instance.ConnectedTcpList.Remove(relation.readTcp); }