private static async Task StartTcpClient(string ip, int port) { if (_isConnected) { return; } _isConnected = true; using (TcpClient client = new TcpClient()) { try { client.ConnectAsync(ip, port).Wait(3000); } catch (Exception) { _trace.TraceWarning($"Unable to connect, try again later."); _isConnected = false; return; } using (NetworkStream stream = client.GetStream()) { _trace.TraceInformation("Username:"******"Failed to send username to server, stopping."); _isConnected = false; return; } while (true) { // read the data to send to the server _trace.TraceInformation("What to send?"); string line = Console.ReadLine(); // send the text to the server if (!await _writer.WriteLineAsync(stream, line)) { break; } // read the response of the server string response = await _reader.ReadLineAsync(stream); if (response == null) { break; } _trace.TraceVerbose($"Response from server {response}"); } } } _isConnected = false; }
private async Task HandleConnection(TcpClient client) { _trace.TraceInformation($"New connection from {client.Client.RemoteEndPoint}"); client.ReceiveTimeout = 30; client.SendTimeout = 30; try { using (NetworkStream stream = client.GetStream()) { while (true) { // read the data from the client string line = await _reader.ReadLineAsync(stream, false); // if the data was not read during the retry process then close this client if (line == null) { break; } bool commandFound = ProcessPossibleCommand(client, line); string userName = _clientStore.GetUserName(client); _trace.TraceInformation($"{userName}: {line}"); // echo back if (!commandFound) { await _writer.WriteLineAsync(stream, line); } } } } finally { _trace.TraceVerbose("Client connection closed"); client.Close(); string userName = _clientStore.RemoveClient(client); _trace.TraceInformation($"{userName} disconnected"); } }