using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; //IP Range Updater namespace Mistox.Client { public class mTCPClient : IDisposable { TcpClient Server; public mTCPClient( IPEndPoint ServerAddress ) { Server = new TcpClient( AddressFamily.InterNetwork ); Server.NoDelay = true; Server.Connect( ServerAddress ); ClientInterface.ServerClientInstance.Alive = true; Thread RThread = new Thread(async () => { await ReceiveThread(); }); RThread.Start(); } async Task ReceiveThread() { using( NetworkStream ns = Server.GetStream() ) { try { while( ClientInterface.ServerClientInstance.Alive ) { if( Server.Connected ) { Console.WriteLine( "Connected to server" ); ClientInterface.ServerClientInstance.onConnected.Invoke( new object(), new EventArgs() ); } else if( !Server.Connected ) { Console.WriteLine( "Disconnected from server" ); ClientInterface.ServerClientInstance.onDisconnected?.Invoke( new object(), new EventArgs() ); ClientInterface.ServerClientInstance.Alive = false; } byte[] StreamData = new byte[1024]; int bytesRead = await ns.ReadAsync(StreamData, 0, StreamData.Length); if( bytesRead > 0 ) { dynamic data = mSerialize.tReceive( StreamData.Sub( 0, bytesRead ) ); if( data != null ) { ClientInterface.ServerClientInstance.onReceive?.Invoke( data, new EventArgs() ); } } } } catch( Exception ) { Console.WriteLine( "You have disconnected from the server" ); ClientInterface.ServerClientInstance.onDisconnected?.Invoke( new object(), new EventArgs() ); ClientInterface.ServerClientInstance.Alive = false; } } } public async Task Send(T packet) { byte[] data = DataPacket.Serialize( packet ); await Server.GetStream().WriteAsync( data, 0, data.Length ); } public void Dispose() { ClientInterface.ServerClientInstance.Alive = false; Server.Close(); Server = null; } } }